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

2024-04-26 07:13:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个浮点数数组,我希望使用一个取决于重新计算的列的公式重新计算新值。在

我最初尝试循环遍历列,屏蔽除了要重新计算的列之外的数组,并使用numpy.putmask公司但这并没有保留顺序,因为它试图在每个元素中放置一个值,如果不这样做,则尝试在下一个元素上使用下一个计算值,a 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.]]

我需要一个解决方案,它将用相同的值重试,直到找到一个真正的值,这样x看起来像:

^{pr2}$

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


Tags: numpyfalsetrue元素顺序np公司mask
1条回答
网友
1楼 · 发布于 2024-04-26 07:13:06

putmask(x,mask,y)为每个n设置x.flat[n] = y[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.flatTrueFalse之间交替出现,所以您最终将x.flat中的每个其他值设置为y中的其他值。在

由于yx的大小不同,y中的值是重复的。这就是调用后在x中看到的(不希望的)交替值的原因 putmask(x,mask,y)。在

如果相反,您希望在x为真的情况下为x分配新值, 那么您只需要使用numpy indexing赋值:

^{pr2}$

例如

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.]]

相关问题 更多 >