2016-06-17 5 views
7

Angenommen, ich habe eine Matrix A mit einigen beliebigen Werten:Indexing eines Array von einer anderen in numpy

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

und eine Matrix B die Indizes der Elemente in A enthält:

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

Wie wähle ich Werte von A spitz von B, dh:

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

Antwort

9

können Sie verwenden NumPy's advanced indexing -

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

Probelauf - -

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

One auch linear indexing können

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

Vielen Dank, sehr nützlich. – voo

+0

Ich verstehe nicht, wie diese funktionieren ... Könntest du ein paar Erklärungen hinzufügen? –

+0

@JasonS Grundsätzlich ein Range-Array entlang der ersten Achse verwenden, um für jedes Element in "B" einen pro Achse auszuwählen. Der bereitgestellte Link sollte alle benötigten Informationen enthalten. – Divakar

0

Es folgt der Lösung unter Verwendung for Schleife:

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) 

Above können auch in prägnanter Liste Verständnis Form geschrieben werden:

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) 

Ausgang:

[[2 2 4 5] 
[1 9 8 6] 
[2 0 7 8]] 
Verwandte Themen