2014-01-28 6 views
8

Ich arbeite mit einem 2D-NumPy-Array. Ich möchte den (Spalten-, Zeilen-) Index oder die (x, y) -Koordinate erhalten, wenn Sie das lieber so denken, von meinem 2D-Array, das eine boolesche Bedingung erfüllt.Get (Spalte, Zeile) Index von NumPy-Array, die eine boolesche Bedingung erfüllt

Der beste Weg, kann ich erklären, was ich versuche, über ein triviales Beispiel zu tun ist:

>>> a = np.arange(9).reshape(3, 3) 
>>> b = a > 4 
>>> b 
>>> array([[False, False, False], 
      [False, False, True], 
      [ True, True, True]], dtype=bool) 

An dieser Stelle habe ich jetzt eine boolean-Array, der anzeigt, wo a > 4.

Mein Ziel an diesem Punkt ist, greifen Sie die Indizes der Booleschen Array, wo der Wert True ist. Zum Beispiel haben die Indizes (1, 2), (2, 0), (2, 1) und (2, 2) alle den Wert True.

Mein Endziel ist mit einer Liste von Indizes, um am Ende:

>>> indexes = [(1, 2), (2, 0), (2, 1), (2, 2)] 

Auch hier betone ich den Punkt, dass der Code über ein triviales Beispiel ist, aber die Anwendung von dem, was ich versuche zu tun könnte beliebige Indizes haben, wo a > 4 und nicht etwas auf arange und reshape basiert.

+0

Beachten Sie, dass die Indizes Sie tatsächlich gab sind (y, x) um, die auch das, was Antwort liefert. – letmaik

Antwort

5

Eine Alternative zur Antwort von @Ashwini Chaudhary, ist numpy.nonzero

>>> a = np.arange(9).reshape(3,3) 
>>> b = a > 4 
>>> np.nonzero(b) 
(array([1, 2, 2, 2]), array([2, 0, 1, 2])) 

>>> np.transpose(np.nonzero(b)) 
array([[1, 2], 
     [2, 0], 
     [2, 1], 
     [2, 2]]) 

EDIT: Was ist schneller. nonzero und where sind im Wesentlichen gleichwertig, aber transpose dreht sich hier das falsche zu sein (auch wenn es mentioned in the docs ist):

In [15]: N = 5000 

In [16]: a = np.random.random((N, N)) 

In [17]: %timeit np.nonzero(a > 0.5) 
1 loops, best of 3: 470 ms per loop 

In [18]: %timeit np.transpose(np.nonzero(a > 0.5))  # ooops 
1 loops, best of 3: 2.56 s per loop 

In [19]: %timeit np.where(a > 0.5) 
1 loops, best of 3: 467 ms per loop 

In [20]: %timeit np.column_stack(np.where(a > 0.5)) 
1 loops, best of 3: 653 ms per loop 
Verwandte Themen