Python 结构化数组的掩码应该是结构化的吗?

Python 结构化数组的掩码应该是结构化的吗?,python,arrays,numpy,structured-array,Python,Arrays,Numpy,Structured Array,我正在调查和几个相关的问题。事实证明,所有这些问题都与阵列本身是结构化的,但其掩码不是: In [38]: R = numpy.zeros(10, dtype=[("A", "<f2"), ("B", "<f4")]) In [39]: Rm = numpy.ma.masked_where(R["A"]<5, R) In [41]: Rm.dtype Out[41]: dtype([('A', '<f2'), ('B', '<f4')]) In [42]: R

我正在调查和几个相关的问题。事实证明,所有这些问题都与阵列本身是结构化的,但其掩码不是:

In [38]: R = numpy.zeros(10, dtype=[("A", "<f2"), ("B", "<f4")])

In [39]: Rm = numpy.ma.masked_where(R["A"]<5, R)

In [41]: Rm.dtype
Out[41]: dtype([('A', '<f2'), ('B', '<f4')])

In [42]: Rm.mask.dtype
Out[42]: dtype('bool')

# Now, both `__getitem__` and `__repr__` will result in errors — see issue #2972

[38]中的
:R=numpy.zero(10,dtype=[(“A”,”第一种情况下的错误表明方法希望掩码的字段数(和名称)与基数组相同

__getitem__:  dout._mask = _mask[indx]
_recursive_printoption: (curdata, curmask) = (result[name], mask[name])
如果掩码数组是使用“main”构造函数生成的,则掩码具有相同的结构

Rn = np.ma.masked_array(R, mask=R['A']>5)
Rn.mask.dtype: dtype([('A', '?'), ('B', '?')])
换句话说,每个元素的每个字段都有一个掩码值

masked_数组
doc显然希望“相同形状”包含
dtype
结构。
Mask:必须转换为与“数据”形状相同的布尔数组。

如果我尝试以与
masked\u相同的方式设置掩码,其中

Rn._mask=R['A']>5
我得到了同样的打印错误。结构化掩码被新的布尔值覆盖,改变了它的数据类型。相反,如果我使用

Rn.mask=R['A']<5
返回具有结构化掩码的数组,即使该数组是以非结构化掩码开始的。这是因为它使用
Rm.\uuuu setmask\uuuu
,这对字段敏感。这是
mask
属性的
set
函数

Rm.tolist()  # same error as str()
masked_,其中
以以下开头:

cond = make_mask(condition)

make_mask
返回简单的'bool'数据类型。也可以使用数据类型调用它,生成结构化掩码:
np.ma.make_mask(R['a']我意识到了这一切。问题是:
masked_中的bug在哪里
(结构化数组的掩码应该是结构化的),还是其他函数中的bug(他们应该期望结构化数组的掩码是结构化的或非结构化的)?从逻辑上讲,两者对我来说都是有意义的,因此有一个论点认为两者都应该被允许。掩码当然必须具有相同的形状。但是它的数据类型也必须具有相同的形状吗?我试图证明核心
ma
功能假设一个结构化掩码,并且事实上
掩码\u其中
允许您设置非结构化掩码是一个bug,是预结构化的日子遗留下来的。
Rm.tolist()  # same error as str()
cond = make_mask(condition)
recordmask = property(fget=_get_recordmask)