问题描述
假设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由于我不明白的原因而变成整数。为什么会发生这种情况?是否有方法或性能上的理由可以单次执行此操作?
解决方法
我必须首先说一下这样做会大大降低可读性。如果您不希望其他人(或您自己)再次使用该代码,则只需使用两行。该答案仅应说明可以做什么,而不是可以做什么。
表达式A=B=x
将x
分配给A
和B
。如果您真的想将所有内容都压缩到一条线上,可以尝试类似
import numpy as np
a = np.arange(5)
(b:=a.copy())[a!=0]=1
与赋值(:=
)运算符不同,=
(海象)运算符实际上会求出赋值。 (请注意,A=B=x
之所以有效,是因为它基本上是t=x; A=t; B=t
的简写,但是A=(B=x)
将不起作用,因为该赋值不会得出任何结果。但是您应该编写A=(B:=x)
。 ),然后a
保持不变,与您的第一个版本相对应,所以
>>> b
array([0,1,1])
>>> a
array([0,2,3,4])
,
大概您看到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