给定一个数组和一个掩码,我们可以为掩码中为 TRUE 的位置分配新值:
import numpy as np
a = np.array([1,2,3,4,5,6])
mask1 = (a==2) | (a==5)
a[mask1] = 100
print a
# [ 1 100 3 4 100 6]
但是,如果我们在第一个掩码上应用第二个掩码,我们可以访问这些值但不能修改它们:
a = np.array([1,2,3,4,5,6])
mask1 = (a==2) | (a==5)
mask2 = (a[mask1]==2)
print a[mask1][mask2]
# [2]
a[mask1][mask2] = 100
print a
# [ 1 2 3 4 5 6 ]
为什么会这样?
(即使这样做看起来很奇怪。只是出于好奇)
最佳答案
这可能是因为您混合 getters 和 setters 防止反向传播。
这是因为您使用 mark1
作为索引器:
>>> mask1
array([False, True, False, False, True, False], dtype=bool)
现在通过设置 a[mask1] = 100
,您将设置所有 mask1
为真的元素,从而导致
>>> a
array([ 1, 100, 3, 4, 100, 6])
请注意,您只是在 a
上调用了“setter”。
现在,对于 a[mask1][mask2] = 100
,您实际上同时调用了 getter 和 setter。实际上你可以这样写:
temp = a[mask1] #getter
temp[mask2] = 2#setter
因此,您只在 temp
中设置值,因此可以说该值不是“反向传播” a
本身。您应该将 temp
视为一个 copy(尽管在内部 python 解释器绝对有可能以不同方式处理它)。
注意:请注意,在某些情况下此行为可能会起作用:例如,如果 temp
是数组上的一个 View ,它可能支持反向传播。 This page例如显示返回 View 而不是副本的方法。
关于python - 使用两个掩码 a[mask1][mask2]=value 更新数组值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32739828/