使用putmask替换数组中的列值并保留顺序

时间:2011-05-26 15:58:21

标签: python arrays numpy

我有一个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.]]

欢迎任何解决方案或其他方法。感谢。

1 个答案:

答案 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

由于TrueFalsex.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}}