2010-10-04 19 views
6

Mam trochę kodu, który próbuje znaleźć zawartość tablicy w indeksach określonych przez inną, które mogą określać indeksy spoza zakresu wcześniejszej tablicy.Indeksowanie za pomocą maskowanych tablic w numpy

input = np.arange(0, 5) 
indices = np.array([0, 1, 2, 99]) 

Co chcę zrobić to: wejście druku [indeksy] i uzyskać [0 1 2]

Ale to plony wyjątek (zgodnie z oczekiwaniami):

IndexError: index 99 out of bounds 0<=index<5 

Pomyślałem, że mogę użyć ukrytych tablic do ukrywania indeksów poza polem:

indices = np.ma.masked_greater_equal(indices, 5) 

Ale nadal:

>print input[indices] 
IndexError: index 99 out of bounds 0<=index<5 

Chociaż:

>np.max(indices) 
2 

Więc mam do wypełnienia pierwszej zamaskowanego tablicę, która jest irytujące, ponieważ nie wiem, co wartość wypełnienia można używać nie wybrano żadnych wskaźników dla tych, które są poza zakresem:

wejście drukowania [np.ma.filled (indeksy 0)]

Moje pytanie brzmi: w jaki sposób można efektywnie używać numpy do wybierania wskaźników bezpiecznie z tablicy bez przekraczania granic tablicy wejściowej?

Odpowiedz

5

Bez użycia zamaskowanych tablice, można usunąć indeksy większa lub równa 5 tak:

print input[indices[indices<5]] 

EDIT: Zauważ, że jeśli również chciał wyrzucić negatywne indeksy, można napisać:

print input[indices[(0 <= indices) & (indices < 5)]] 
+0

D'oh to działa. Nadal ciekawi mnie, dlaczego nie możemy właściwie używać maskowanych tablic do indeksowania, ale przypuszczam, że to naprawdę nie ma znaczenia. – Widjet

3

Jest to BARDZO ZŁY pomysł na indeksowanie z maskowanymi tablicami. Był (bardzo krótki) czas, w którym użycie MaskedArrays do indeksowania spowodowałoby wyjątek, ale było trochę zbyt surowo ...

W teście filtrujesz indices, aby znaleźć wpisy pasujące do warunku. Co powinieneś zrobić z brakującymi wpisami swojej MaskedArray? Czy warunek jest fałszywy? Prawdziwe ? Czy używasz domyślnego? To ty, użytkownik, decydujesz, co robić.

Używanie oznacza, że ​​gdy element indices jest zamaskowany (jak w, nieokreślonym), chcesz wziąć pierwszy indeks (0) jako domyślny. Prawdopodobnie nie tego chciałeś.

Tutaj po prostu użyłbym input[indices.compressed()]: metoda compressed spłaszcza twój MaskedArray, zachowując tylko niezamaskowane wpisy.

Ale jak sobie uświadomiłeś, prawdopodobnie nie potrzebowałeś MaskedArrays na pierwszym miejscu.

+0

"skompresowane" było tym, za czym byłem, dzięki. Przyjąłem, że użycie maskowanych tablic do indeksu skutecznie ich skompresuje, co wydaje się rozsądną wartością domyślną. Ale przypuszczam, że to prawdopodobnie wymagałoby przydzielenia nowej tablicy, co spowodowałoby kosztowną domyślną. – Widjet

Powiązane problemy