2014-11-27 23 views
8

Potrzebuję dowiedzieć się, jak mogę znaleźć cały indeks wartości w 2d numpy tablicy.Jak znaleźć indeks wartości w tablicy 2d w Pythonie?

Na przykład, mam następujący 2d tablicy:

([[1 1 0 0], 
    [0 0 1 1], 
    [0 0 0 0]]) 

Muszę znaleźć indeks wszystko-tych 1 i 0.

1: [(0, 0), (0, 1), (1, 2), (1, 3)] 
0: [(0, 2), (0, 3), (1, 0), (1, 1), (the entire all row)] 

próbowałem tego, ale to nie daje mi wszystkie indeksy:

t = [(index, row.index(1)) for index, row in enumerate(x) if 1 in row] 

Zasadniczo, to daje mi tylko jednego wskaźnika w każdym rzędzie [(0, 0), (1, 2)].

+0

czy to w rzeczywistości tablica numpy? –

+0

tak, jego . W rzeczywistości mam dużą tablicę 2d i otrzymałem ją z ekstrakcji obrazu. – Pete

+0

Czy są tylko zer i jedynek? –

Odpowiedz

17

Możesz użyć np.where, aby zwrócić krotkę tablic indeksów x i y, gdzie dany warunek zawiera tablicę.

Jeśli a to nazwa macierzy:

>>> np.where(a == 1) 
(array([0, 0, 1, 1]), array([0, 1, 2, 3])) 

Jeśli chcesz listę (X, Y), parami, można zip dwie tablice:

>>> zip(*np.where(a == 1)) 
[(0, 0), (0, 1), (1, 2), (1, 3)] 

Albo nawet lepiej, @jme wskazuje, że np.asarray(x).T może być skuteczniejszym sposobem generowania par.

+1

Po prostu notatka: 'zip (* x)' może być wolne dla dużych 'x', gdzie' x = np.where (a == 1) '. Jeśli tablica 2d jest w porządku, 'np.asarray (x) .T' jest trochę szybszy, a jeśli * naprawdę * chcesz listy list,' np.asarray (x) .T.tolist() 'jest nieznacznie szybszy. – jme

6

Problem ze zrozumieniem liście podany jest to, że jeździ tylko jeden poziom głęboko, trzeba zagnieżdżony listowych:

a = [[1,0,1],[0,0,1], [1,1,0]] 

>>> [(ix,iy) for ix, row in enumerate(a) for iy, i in enumerate(row) if i == 0] 
[(0, 1), (1, 0), (1, 1), (2, 2)] 

W takiej sytuacji, jeśli pracujesz z numpy tablicy, to lepiej używać wbudowanych funkcji zgodnie z sugestią ajcr.

+0

Dziękuję za tę poprawkę. – Pete

Powiązane problemy