我正在研究numpy 问题 2972 和几个相关问题。事实证明,所有这些问题都与数组本身是结构化的情况有关,但它的掩码不是:
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
如果我以不同方式创建掩码数组,则掩码 dtype 的结构类似于数组本身的 dtype:
In [44]: Q.dtype
Out[44]: dtype([('A', '<f4'), ('B', '<f4')])
In [45]: Q.mask.dtype
Out[45]: dtype([('A', '?'), ('B', '?')])
前一种情况暴露出几个问题。例如,Rm.__repr__()
并且Rm["A"]
两者都导致IndexError
,尽管它ValueError
在过去是 a。
按照设计,模式是否应该是可能的,在哪里A.dtype
是结构化的,但A.mask.dtype
不是结构化的?
换句话说:是__repr__
和__getitem__
方法中的错误numpy.ma.core.MaskedArray
,还是真正的错误发生在之前 - 通过首先允许这样一个屏蔽的结构化数组存在?