gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 02:29:22 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com