我有一个numpy数组的浮点数,我希望使用一个取决于重新计算的列的公式重新计算新值。
我最初尝试循环遍历列,屏蔽除了要重新计算的列之外的数组,并使用numpy.putmask替换新值,但这不会保留顺序,因为它会尝试放置每个元素中的值,并且在下一个元素àla:
上尝试使用下一个计算值时失败>>> import numpy as np
>>> x = [[ 1., 2.],
[ 3., 4.],
[ 5., 6.],
[ 7., 8.],
[ 9., 10.]]
>>> mask = [[ True, False],
[ True, False],
[ True, False],
[ 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.]]
欢迎任何解决方案或其他方法。感谢。
答案 0 :(得分:1)
putmask(x,mask,y)
为x.flat[n] = y[n]
为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, True, False, True, False, True, False]
。
mask.flat
由于True
在False
和x.flat
之间交替显示,您最终会将y
中的所有其他值设置为y
中的其他每个值。
由于x
的大小与y
的大小不同,因此会重复x
中的值。这导致您在调用后在putmask(x,mask,y)
中看到的(不期望的)交替值
x
。
如果您希望在mask
为True的情况下将新值分配给x[mask]=y
,
那么你所需要的只是numpy indexing的作业:
import numpy as np
x = np.array([[ 1., 2.],
[ 3., 4.],
[ 5., 6.],
[ 7., 8.],
[ 9., 10.]])
mask = np.array([[ True, False],
[ True, False],
[ True, False],
[ 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.]]
例如,
{{1}}