gpt4 book ai didi

python - 如何更改 numpy 中屏蔽数组的值?

转载 作者:太空狗 更新时间:2023-10-30 01:05:32 25 4
gpt4 key购买 nike

在我的代码中,在某些时候我尝试修改掩码数组的值,但 python 似乎忽略了这一点。我认为这与内存存储在数组中的方式有​​关,就好像我正在修改值的副本而不是值本身一样,但我对此并不精通,不知道如何解决

这是我正在尝试做的事情的简化版本:

    x = np.zeros((2,5)) # create 2D array of zeroes
x[0][1:3] = 5 # replace some values along 1st dimension with 5

mask = (x[0] > 0) # create a mask to only deal with the non negative values

x[0][mask][1] = 10 # change one of the values that is non negative

print x[0][mask][1] # value isn't changed in the original array

这个的输出是:

    5.0

什么时候应该是 10。

任何帮助将不胜感激,理想情况下这需要是可扩展的(这意味着我不一定知道 x 的形状,或者值在哪里是非负的,或者我需要修改哪个)。

我在 Ubuntu 16.04.2 上的 python 2.7.12 上使用 numpy 1.11.0

谢谢!

最佳答案

让我们概括一下您的问题:

In [164]: x=np.zeros((2,5))
In [165]: x[0, [1, 3]] = 5 # index with a list, not a slice
In [166]: x
Out[166]:
array([[ 0., 5., 0., 5., 0.],
[ 0., 0., 0., 0., 0.]])

当索引发生在 = 之前时,它是 __setitem__ 的一部分并作用于原始数组。无论索引使用切片、列表还是 bool 掩码,都是如此。

但是带有列表或掩码的选择会生成一个副本。进一步的索引赋值仅影响该副本,而不影响原始文件。

In [167]: x[0, [1, 3]]
Out[167]: array([ 5., 5.])
In [168]: x[0, [1, 3]][1] = 6
In [169]: x
Out[169]:
array([[ 0., 5., 0., 5., 0.],
[ 0., 0., 0., 0., 0.]])

解决此问题的最佳方法是修改 mask 本身:

In [170]: x[0, np.array([1,3])[1]] = 6
In [171]: x
Out[171]:
array([[ 0., 5., 0., 6., 0.],
[ 0., 0., 0., 0., 0.]])

如果掩码是 bool 值,您可能需要将其转换为索引数组

In [174]: mask = x[0]>0
In [175]: mask
Out[175]: array([False, True, False, True, False], dtype=bool)
In [176]: idx = np.where(mask)[0]
In [177]: idx
Out[177]: array([1, 3], dtype=int32)
In [178]: x[0, idx[1]]
Out[178]: 6.0

或者你可以直接调整 bool 值

In [179]: mask[1]=False
In [180]: x[0,mask]
Out[180]: array([ 6.])

因此,在您的大问题中,您需要注意何时索引会生成一个 View 并且它是一个副本。您需要熟悉列表、数组和 bool 值的索引,并了解如何在它们之间切换。

关于python - 如何更改 numpy 中屏蔽数组的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43921510/

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