python - 使用两个掩码 a[mask1][mask2]=value 更新数组值

标签 python arrays numpy

给定一个数组和一个掩码,我们可以为掩码中为 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 ]

为什么会这样?

(即使这样做看起来很奇怪。只是出于好奇)

最佳答案

这可能是因为您混合 getterssetters 防止反向传播

这是因为您使用 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/

相关文章:

python - 按降序从数组中获取前 N 个元素

python - 尝试转换格式为 10/2/2012 9:00:00 AM 时出现错误 : invalid unit abbreviation:/,

python - 将字典值转换为具有特定顺序的字符串对象

python - 保持进程监听相互通信

javascript - 带有 ng-model angularjs 的多选复选框

python - 从多项式回归(图)获取函数 ("f(x)")

python - aiohttp:限制并行请求的速率

javascript根据条件从嵌套的对象数组返回属性值

javascript - 两个数组组合成 {array1[i], array2[i]} 没有双 for 循环

c++ - 在 xtensor 中使用 xt::where 时遇到问题