如何通过使用单个赋值屏蔽另一个 numpy 数组来创建一个新的 numpy 数组

how to create a new numpy array by masking another numpy array with a single assignment

假设A是一个NP数组。

如果我这样做:

B = np.copy(A)
B[B !=0] = 1 

A[A != 0]=1
B=np.copy(A)

我将 B 作为 A 的掩码版本,即所需的输出。但是,如果我尝试这样的作业:

B= A[A !=0]=1

B 由于我不明白的原因变成了一个整数。为什么会发生这种情况,是否有一种方法或性能原因可以将此操作作为单个分配执行?

大概您看到 B 的值为 1?

在所有计算机语言中,X = Y = expr 的含义都存在一些歧义。意思是把expr赋给Y,再把Y赋给X?或者是指将expr同时赋值给X和Y。Numpy显然认为是后者。

您将看到与

相同的行为
b = np.zeros((5))
a = b[0] = 1

即使 b[0] == 1.0

,您也会看到 a 被赋值为 1

我必须在开头说任何这样做的尝试都会大大降低可读性。如果您不想让其他人(或您自己)再次使用该代码,只需使用两行。这个答案只是为了证明可以做什么,而不是应该做什么。

表达式 A=B=xx 分配给 AB。如果你真的想把所有东西都挤在一行上,你可以尝试像

这样的东西
import numpy as np
a = np.arange(5)
(b:=a.copy())[a!=0]=1

:= (walrus) 运算符实际上求值为分配的值,这与赋值 (=) 运算符不同。 (请注意,A=B=x 有效,因为它基本上是 t=x; A=t; B=t 的 shorthand,但 A=(B=x) 将无效,因为赋值不计算任何值。你可以写 A=(B:=x) though.) 然后 a 保持不变,这对应于你的第一个版本,所以

>>> b
array([0, 1, 1, 1, 1])
>>> a
array([0, 1, 2, 3, 4])