2014-09-13 22 views
16

Chciałbym uzyskać indeks dwuwymiarowej tablicy Numpy, która pasuje do wiersza. Na przykład, moja tablica jest taka:Znajdź pasujące wiersze w dwuwymiarowej tablicy numpy

vals = np.array([[0, 0], 
       [1, 0], 
       [2, 0], 
       [0, 1], 
       [1, 1], 
       [2, 1], 
       [0, 2], 
       [1, 2], 
       [2, 2], 
       [0, 3], 
       [1, 3], 
       [2, 3], 
       [0, 0], 
       [1, 0], 
       [2, 0], 
       [0, 1], 
       [1, 1], 
       [2, 1], 
       [0, 2], 
       [1, 2], 
       [2, 2], 
       [0, 3], 
       [1, 3], 
       [2, 3]]) 

chciałbym uzyskać indeks odpowiadający row [0, 1], który jest wskaźnik 3 i 15. Kiedy coś zrobić jak numpy.where(vals == [0 ,1]) mam ...

(array([ 0, 3, 3, 4, 5, 6, 9, 12, 15, 15, 16, 17, 18, 21]), array([0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0])) 

Chcę tablicy indeksowej ([3, 15]).

Odpowiedz

18

Trzeba funkcję np.where uzyskać indeksy:

>>> np.where((vals == (0, 1)).all(axis=1)) 
(array([ 3, 15]),) 

Aby rozłączyć to:

>>> vals == (0, 1) 
array([[ True, False], 
     [False, False], 
     ... 
     [ True, False], 
     [False, False], 
     [False, False]], dtype=bool) 

i wywołanie metody .all na tej tablicy (z axis=1) daje True gdzie oba są prawdziwe:

>>> (vals == (0, 1)).all(axis=1) 
array([False, False, False, True, False, False, False, False, False, 
     False, False, False, False, False, False, True, False, False, 
     False, False, False, False, False, False], dtype=bool) 

i dostać których indeksy są True:

>>> np.where((vals == (0, 1)).all(axis=1)) 
(array([ 3, 15]),) 

Moje rozwiązanie jest nieco bardziej czytelne, ale jak wskazuje unutbu, następujące mogą być szybciej i zwraca taką samą wartość jak (vals == (0, 1)).all(axis=1):

>>> (vals[:, 0] == 0) & (vals[:, 1] == 1) 
3
In [5]: np.where((vals[:,0] == 0) & (vals[:,1]==1))[0] 
Out[5]: array([ 3, 15]) 

nie jestem pewien dlaczego, ale jest to znacznie szybciej niż
np.where((vals == (0, 1)).all(axis=1)):

In [34]: vals2 = np.tile(vals, (1000,1)) 

In [35]: %timeit np.where((vals2 == (0, 1)).all(axis=1))[0] 
1000 loops, best of 3: 808 µs per loop 

In [36]: %timeit np.where((vals2[:,0] == 0) & (vals2[:,1]==1))[0] 
10000 loops, best of 3: 152 µs per loop 
3

użyciu pakietu numpy_indexed, można po prostu napisać:

import numpy_indexed as npi 
print(np.flatnonzero(npi.contains([[0, 1]], vals))) 
Powiązane problemy