如何通过一次分配掩盖另一个numpy数组来创建新的numpy数组

问题描述

假设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=xx分配给AB。如果您真的想将所有内容都压缩到一条线上,可以尝试类似

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

,您也会看到为a分配了1

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...