gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:28:13 25 4
gpt4 key购买 nike

我有一个 numpy float 数组,我希望使用一个取决于要重新计算的列的公式来重新计算新值。

我最初尝试遍历列,屏蔽除要重新计算的列之外的数组,并使用 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.]]

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

最佳答案

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.flatTrue 之间交替和 False ,您最终设置了 x.flat 中的所有其他值与 y 中的所有其他值.

yx 大小不同, y 中的值被重复。这就是导致您在 x 中看到的(不需要的)交替值的原因打电话后 putmask(x,mask,y) .

相反,如果您希望为 x 分配新值无论在哪里mask是真的,那么你所需要的就是分配 numpy indexing :

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

关于python - 使用 putmask 替换数组中的列值并保留顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6141493/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com