numpy改变元素匹配条件

use*_*298 2 numpy

对于两个numpy数组a,b

a=[1,2,3]      b=[4,5,6]
Run Code Online (Sandbox Code Playgroud)

我想将a的x <2.5数据更改为b.所以我试过了

a[a<2.5]=b
Run Code Online (Sandbox Code Playgroud)

希望是的a=[4,5,3].但这会产生错误

Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    a[a<2.5]=b
ValueError: NumPy boolean array indexing assignment cannot assign 3 input values to the 2 output values where the mask is true
Run Code Online (Sandbox Code Playgroud)

问题是什么?

sap*_*api 6

您看到的问题是掩码如何在numpy数组上工作的结果.

当你写作

a[a < 2.5]
Run Code Online (Sandbox Code Playgroud)

你找回a与面具匹配的元素a < 2.5.在这种情况下,这将只是前两个元素.

试图这样做

a[a < 2.5] = b
Run Code Online (Sandbox Code Playgroud)

是一个错误,因为b有三个元素,但a[a < 2.5]只有两个.


在numpy中实现结果的简单方法是使用np.where.

这个的语法是np.where(condition, valuesWhereTrue, valuesWhereFalse).

在你的情况下,你可以写

newArray = np.where(a < 2.5, b, a)
Run Code Online (Sandbox Code Playgroud)

或者,如果您不想要新数组的开销,则可以就地执行替换(正如您在问题中尝试的那样).要实现这一点,您可以写:

idxs = a < 2.5
a[idxs] = b[idxs]
Run Code Online (Sandbox Code Playgroud)