2011-12-23 11 views
5

Czy istnieje sposób na wyliczenie niezablokowanych lokalizacji zamaskowanego numpy ndarray (np. W sposób, w jaki ndenumerate robi to dla zwykłego ndarrays, ale pomija wszystkie zamaskowane wpisy)?numpy: ndenumerate dla zamaskowanych tablic?

EDYCJA: dokładniej: wyliczenie powinno nie tylko pomijać zamaskowane wpisy, ale także pokazywać indeksy niezamaskowanych w oryginalnej tablicy. Na przykład. jeśli pierwszych pięć elementów tablicy 1-d zostanie zamaskowanych, a następny ma niezamaskowaną wartość 3, wówczas wyliczenie powinno rozpocząć się od czegoś podobnego do ((5,), 3), ....

Dzięki!

PS: należy zauważyć, że chociaż możliwe jest zastosowanie ndenumerate do zamaskowanego ndarray, wynikowe wyliczenie nie rozróżnia jego zamaskowanych i normalnych wpisów. W rzeczywistości ndenumerate nie tylko nie odfiltrowuje zamaskowanych wpisów z wyliczenia, ale nawet nie zastępuje wyliczonych wartości stałą o wartości masked. Dlatego nie można przystosować do tego zadania ndenumerate, po prostu opakowując ndenumerate z odpowiednim filtrem.

+0

spojrzenie na sprężone funkcji tablic MA – tillsten

Odpowiedz

2

Jak o:

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 

który daje

(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

można otworzyć tylko prawidłowe wpisy korzystając odwrotność maską jako wskaźnik:

>>> 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 

Zobacz this dla Detale.

Wyliczenie nad ważny tylko wpisy z indeksów z oryginalnej tablicy:

>>> 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 
Powiązane problemy