numpy:ndenumerate用于掩码数组?

biswetbf  于 2023-10-19  发布在  其他
关注(0)|答案(2)|浏览(82)

是否有方法枚举掩码numpy ndarray的非掩码位置(例如,以ndenumerate对常规ndarrays的方式,但省略所有掩码条目)?
编辑:更准确地说:枚举不仅应该跳过掩码条目,而且还应该显示原始数组中未掩码条目的索引。例如,如果一维数组的前五个元素被屏蔽,而下一个元素的未屏蔽值为3,那么枚举应该从((5,), 3), ...开始。
谢谢你,谢谢
PS:注意,虽然可以将ndenumerate应用于掩码ndarray,但结果枚举不会区分其掩码和正常条目。事实上,ndenumerate不仅不会从枚举中过滤出掩码条目,而且甚至不会用masked常量替换枚举值。因此,我们不能仅仅用一个合适的过滤器来 Package ndenumerate,从而使ndenumerate适应这个任务。

e1xvtsh3

e1xvtsh31#

您只能使用逆掩码作为索引访问有效条目:

>>> import numpy as np
>>> import numpy.ma as ma
>>> x = np.array([11, 22, -1, 44])
>>> m_arr = ma.masked_array(x, mask=[0, 0, 1, 0])
>>> for index, i in np.ndenumerate(m_arr[~m_arr.mask]): 
        print index, i
(0,) 11
(1,) 22
(2,) 44

详情请参见this
仅枚举具有原始数组索引的有效条目:

>>> for (index, val), m in zip(np.ndenumerate(m_arr), m_arr.mask):
      if not m:
        print index, val 
(0,) 11
(1,) 22
(3,) 44
6pp0gazn

6pp0gazn2#

怎么样:

import numpy as np
import itertools

def maenumerate(marr):
    mask = ~marr.mask.ravel()
    for i, m in itertools.izip(np.ndenumerate(marr), mask):
        if m: yield i

N = 12
a = np.arange(N).reshape(2, 2, 3)+10

b = np.ma.array(a, mask = (a%5 == 0))
for i, val in maenumerate(b):
    print i, val

其产生

(0, 0, 1) 11
(0, 0, 2) 12
(0, 1, 0) 13
(0, 1, 1) 14
(1, 0, 0) 16
(1, 0, 1) 17
(1, 0, 2) 18
(1, 1, 0) 19
(1, 1, 2) 21

相关问题