Python: 应用掩码而不改变原始数组的值

Python: Applying a mask without changing the value to the original array

我正在尝试将一个简单的布尔掩码应用于 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]

您的变量 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/

如前所述,您只会获得对 temp 的新引用。这意味着虽然变量命名不同,但它们都指向同一块内存。因此,通过更改其中一个的值,您实际上会更改两者的值。为避免这种情况,您至少需要使用浅拷贝。这是使用 numpy 执行此操作的两种方法:

temp1 = numpy.copy(temp)

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

正如其他人指出的那样,当您在 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 不是副本,而是新计算的数组),这很有用。