2016-06-17 13 views
7

Załóżmy, że posiada matrycę niektórych dowolnych wartości:indeksowania jednej tablicy kolejny po numpy

array([[ 2, 4, 5, 3], 
     [ 1, 6, 8, 9], 
     [ 8, 7, 0, 2]]) 

i matrycę B zawierający indeksów elementów w:

array([[0, 0, 1, 2], 
     [0, 3, 2, 1], 
     [3, 2, 1, 0]]) 

Jak wybrać wartości z A wskazał przez B, tj:

A[B] = [[2, 2, 4, 5], 
     [1, 9, 8, 6], 
     [2, 0, 7, 8]] 

Odpowiedz

9

Można użyć NumPy's advanced indexing -

A[np.arange(A.shape[0])[:,None],B] 

Można również użyć linear indexing -

m,n = A.shape 
out = np.take(A,B + n*np.arange(m)[:,None]) 

run Sample -

In [40]: A 
Out[40]: 
array([[2, 4, 5, 3], 
     [1, 6, 8, 9], 
     [8, 7, 0, 2]]) 

In [41]: B 
Out[41]: 
array([[0, 0, 1, 2], 
     [0, 3, 2, 1], 
     [3, 2, 1, 0]]) 

In [42]: A[np.arange(A.shape[0])[:,None],B] 
Out[42]: 
array([[2, 2, 4, 5], 
     [1, 9, 8, 6], 
     [2, 0, 7, 8]]) 

In [43]: m,n = A.shape 

In [44]: np.take(A,B + n*np.arange(m)[:,None]) 
Out[44]: 
array([[2, 2, 4, 5], 
     [1, 9, 8, 6], 
     [2, 0, 7, 8]]) 
+0

Dziękuję bardzo użyteczne. – voo

+0

Nie rozumiem, jak te prace ... czy mógłbyś dodać jakieś wyjaśnienia? –

+0

@JasonS Zasadniczo za pomocą tablicy zakresów wzdłuż pierwszej osi wybierz jeden wzdłuż tej osi dla każdego elementu w 'B'. Podany link powinien zawierać wszystkie potrzebne szczegóły. – Divakar

0

Poniżej roztworze przy użyciu for pętlę:

outlist = [] 
for i in range(len(B)): 
    lst = []  
    for j in range(len(B[i])): 
     lst.append(A[i][B[i][j]]) 
    outlist.append(lst) 
outarray = np.asarray(outlist) 
print(outarray) 

powyżej mogą być również napisany w bardziej zwięzłej formie listowego:

outlist = [ [A[i][B[i][j]] for j in range(len(B[i]))] 
       for i in range(len(B)) ] 
outarray = np.asarray(outlist) 
print(outarray) 

wyjściowa:

[[2 2 4 5] 
[1 9 8 6] 
[2 0 7 8]] 
Powiązane problemy