2011-12-23 4 views
5

Есть ли способ перечислить объекты, не замаскированные в масках numpy ndarray (например, так, что ndenumerate делает это для обычного ndarrays, но опускает все замаскированные записи)?numpy: ndenumerate для маскированных массивов?

EDIT: точнее: перечисление должно не только пропускать замаскированные записи, но также показывать индексы немаскированных в исходном массиве. Например. если первые пять элементов массива 1-мерного типа замаскированы, а следующее имеет незамасленное значение 3, то перечисление должно начинаться с чего-то вроде ((5,), 3), ....

Спасибо!

PS: обратите внимание, что, хотя можно применить ndenumerate к замаскированному ndarray, результирующее перечисление не различает его замаскированные и обычные записи. Фактически, ndenumerate не только не отфильтровывает маскированные записи из перечисления, но даже не заменяет перечисленные значения константой masked. Поэтому для этой задачи нельзя адаптировать ndenumerate, просто обернув ndenumerate подходящим фильтром.

+0

посмотреть на сжатую функции мы массивы – tillsten

ответ

2

Как насчет:

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 
7

Вы можете получить доступ только действительные данные с помощью инверсию маски как индекс:

>>> 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 
Смежные вопросы