numpy:面具数组的ndenumerate?
有没有办法遍历一个被屏蔽的 numpy ndarray
中没有被屏蔽的位置?就像 ndenumerate
对普通 ndarrays
的处理方式一样,但要跳过所有被屏蔽的部分。
补充说明一下:这个遍历不仅要跳过被屏蔽的部分,还要显示原始数组中没有被屏蔽的元素的索引。比如,如果一个一维数组的前五个元素都被屏蔽了,而第六个元素的值是3,那么遍历的结果应该像 ((5,), 3), ...
这样开始。
谢谢!
PS:需要注意的是,虽然可以对一个被屏蔽的 ndarray
使用 ndenumerate
,但得到的结果并不会区分被屏蔽的和正常的元素。实际上,ndenumerate
不仅不会把被屏蔽的元素从结果中过滤掉,还不会把遍历到的值替换成 masked
常量。因此,不能仅仅通过给 ndenumerate
加一个合适的过滤器来解决这个问题。
2 个回答
8
你可以通过掩码的反向来访问只有有效的条目:
>>> 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
详细信息请查看这里。
只遍历原始数组中有效条目的索引:
>>> 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
4
这样怎么样:
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