gpt4 book ai didi

python - 无法修改屏蔽数组中的数据。 arr[i] 与 arr.data[i]

转载 作者:行者123 更新时间:2023-11-28 21:58:03 26 4
gpt4 key购买 nike

在修改屏蔽数组中的数据时,我没想到会出现以下行为。似乎可以使用 [] 操作数修改某些值,但不是全部。但是,如果您访问它的数据属性,那么您可以修改所有内容。仅当元组中某个单元格的掩码中存在 True 值时才会发生这种情况(与掩码数组相关的所有操作似乎都正常工作)。

谁能解释一下为什么?

>>> import numpy as np
>>> import numpy.ma as ma
>>> arr = ma.ones(nrows, dtype=[('c1', np.int),('c2', np.int)])
>>> arr.mask[1][0] = True
>>> arr[1][1] = 3
>>> arr[0][0] = 4
>>> arr
masked_array(data = [(4, 1) (--, 1) (1, 1)],
mask = [(False, False) (True, False) (False, False)],
fill_value = (999999, 999999),
dtype = [('c1', '<i8'), ('c2', '<i8')])

>>> arr.data[1][1]=5
>>> arr
masked_array(data = [(4, 1) (--, 5) (1, 1)],
mask = [(False, False) (True, False) (False, False)],
fill_value = (999999, 999999),
dtype = [('c1', '<i8'), ('c2', '<i8')])

最佳答案

我认为这是一个错误。这是正在发生的事情。

当你使用时(按需要工作)

arr.data[1][1]=5

使用函数 _get_data() 并返回底层 nparray 的简单 View 。

当你使用(它工作不正确)

arr[1][1]=5

使用函数 __getitme__()。首先,它进入并尝试获取第 1 行。它检测到该行中的一项被屏蔽并返回该行的屏蔽副本(而不是数组的 View )。潜在的问题是这一行 ma\core.py(当前在 github 上的版本的第 2996 行):

dout = mvoid(dout, mask=mask, hardmask=self._hardmask)

mvoid 函数返回第 1 行的副本(其中包括值 [1][0] 的掩码)而不是第 1 行的 View 。然后处理列索引时,它正在对副本而不是 View 进行更改。

为什么这对不包含掩码的行起作用是因为返回的是 View 而不是 movid() 副本。

整个复制与 View 的事情是 numpy 的一个非常经典的问题。为了对开发人员公平,考虑到 __getitem__() 必须如何为屏蔽数组运行(即,它必须在读取值时返回屏蔽副本)我不确定他们如何解决它。但是,如果有比我更聪明的人有想法,可能值得一张错误票。

关于python - 无法修改屏蔽数组中的数据。 arr[i] 与 arr.data[i],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19179677/

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