如何通过使用单个赋值屏蔽另一个 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=x
将 x
分配给 A
和 B
。如果你真的想把所有东西都挤在一行上,你可以尝试像
这样的东西
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])
假设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=B=x
将 x
分配给 A
和 B
。如果你真的想把所有东西都挤在一行上,你可以尝试像
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])