Python:应用遮罩而不更改原始数组的值

时间:2018-10-22 19:58:09

标签: python numpy mask

我正在尝试将简单的布尔掩码应用于np数组。以下是一个简单的示例。

temp = np.arange(5)
print(temp)
temp1 = temp
temp1[temp1 < 2] = 0
print(temp1)
print(temp)

我已经将temp的值分配给新变量temp1,所以我期望的是掩码仅适用于变量temp1。但是,temp的值也会更新。我不知道为什么会这样。

结果:

[0 1 2 3 4]
[0 0 2 3 4]
[0 0 2 3 4]

3 个答案:

答案 0 :(得分:4)

您的变量temp1temp引用相同的对象。使用.copy()获取项目的浅表副本,这样它就不会修改原始项目。

temp = np.arange(5)
print(temp)
temp1 = temp.copy()
temp1[temp1 < 2] = 0
print(temp1)
print(temp)

如果您想了解有关名称和引用的更多信息,请https://nedbatchelder.com/text/names.html/

答案 1 :(得分:0)

如前所述,您仅获得对temp的新引用。这意味着尽管变量的名称不同,但是它们都指向同一块内存。因此,通过更改一个中的值,实际上可以更改两个中的值。为了避免这种情况,至少需要使用浅表副本。这是使用numpy做到这一点的两种方法:

temp1 = numpy.copy(temp)

temp1 = np.array(temp, copy = True)

答案 2 :(得分:0)

正如其他人指出的那样,在python中处理类似集合的对象时,您需要explicitly ask for a copy。您在此处看到的相同行为也可能发生在列表和字典上。 Numpy具有很好的帮助程序方法numpy.copy(),可以解决您的问题。

# one way
temp1 = temp.copy()

#another way
temp1 = numpy.copy(temp)

要添加我认为可能有用的内容,可以保存遮罩本身,然后通过乘以应用。

mask = temp < 2
masked_temp = temp * mask

这在您希望可视化或重复使用此蒙版并使复制问题不相关之前是很有用的(因为masked_temp不是副本,而是新计算的数组)。