问题描述
||
我有一个浮点数的numpy数组,我希望使用取决于要重新计算的列的公式来重新计算新值。
我最初尝试遍历各列,屏蔽要重新计算的列以外的数组,并用numpy.putmask将新值替换为新值,但这不会保留顺序,因为它尝试在每个值中放置一个值元素,并尝试在下一个元素àla上尝试下一个计算值时失败:
>>> import numpy as np
>>> x = [[ 1.,2.],[ 3.,4.],[ 5.,6.],[ 7.,8.],[ 9.,10.]]
>>> mask = [[ True,False],[ True,False]]
>>> y = [ 21.,22.,23.,24.,25.]
>>> np.putmask(x,mask,y)
>>> print x
[[ 21. 2.]
[ 23. 4.]
[ 25. 6.]
[ 22. 8.]
[ 24. 10.]]
我需要一个解决方案,该解决方案将使用相同的值重试,直到找到True值为止,以使x看起来像:
[[ 21. 2.]
[ 22. 4.]
[ 23. 6.]
[ 24. 8.]
[ 25. 10.]]
欢迎任何解决方案或其他方法。谢谢。
解决方法
putmask(x,mask,y)
为每个n
设置x.flat[n] = y[n]
,其中mask.flat[n]
为真。
In [17]: list(x.flat)
Out[17]: [21.0,2.0,22.0,4.0,23.0,6.0,24.0,8.0,25.0,10.0]
In [18]: list(mask.flat)
Out[18]: [True,False,True,False]
由于ѭ7between在True
和False
之间交替,因此最终将x.flat
中的每个其他值都设置为y
中的其他值。
由于y
与size13ѭ的大小不同,因此重复y
中的值。这就是导致您在调用后在see13ѭ中看到的(不需要的)交替值的原因
putmask(x,y)
。
相反,如果您希望在mask
为True的情况下为x
分配新值,
那么您所需要做的就是分配numpy索引:
x[mask]=y
例如,
import numpy as np
x = np.array([[ 1.,2.],[ 3.,4.],[ 5.,6.],[ 7.,8.],[ 9.,10.]])
mask = np.array([[ True,False],[ True,False]])
y = np.array([ 21.,22.,23.,24.,25.])
x[mask]=y
print(x)
# [[ 21. 2.]
# [ 22. 4.]
# [ 23. 6.]
# [ 24. 8.]
# [ 25. 10.]]