2016-04-02 7 views
0

Ich muss bestimmte Werte aus einem mehrdimensionalen Array extrahieren, die nicht aufeinander folgen.Wertefeld mit Indizes extrahieren

import numpy as np  
A = np.array([[[ 0.,   4.,   0.  ], 
       [ 0.19230769, 4.03846154, 0.  ], 
       [-0.4,   4.8,   0.  ], 
       [ 2.,   1.,   0.  ]], 

       [[ 1.2,   3.4,   0.  ], 
       [ 2.11538462, 4.42307692, 0.  ], 
       [ 0.,   4.,   0.  ], 
       [ 3.6,   1.8,   0.  ]], 

       [[ 1.8,   3.1,   0.  ], 
       [ 3.17307692, 4.63461538, 0.  ], 
       [ 0.,   4.,   0.  ], 
       [ 4.,   2.,   0.  ]]]) 

Für jeden 4x3-Block I eine beliebige Reihe

Zum Beispiel die folgenden Elemente extrahieren möchten:

A[0,2,:] 
A[1,1,:] 
A[2,1,:] 

Also im Grunde die Reihen B = [2,1,1], die mir geben würde:

[-0.4   4.8   0.  ] 
[ 2.11538462 4.42307692 0.  ] 
[ 3.17307692 4.63461538 0.  ] 

Wie geht das effizient?

Antwort

2

könnten Sie "advanced indexing" verwenden:

In [99]: A[[0,1,2], [2,1,1], :] 
Out[99]: 
array([[-0.4  , 4.8  , 0.  ], 
     [ 2.11538462, 4.42307692, 0.  ], 
     [ 3.17307692, 4.63461538, 0.  ]]) 

Hier werden die Indizierung Arrays sind

ind1 = [0, 1, 2] 
ind2 = [2, 1, 1] 

und da ind1 indiziert die erste Achse von A und ind2 wird, um die zweite Achse Indexieren und die dritte Achse wird vollständig geschnitten (mit :), das resultierende Array, result, hat die gleiche Form wie ind1 und ind2 - d.h. (3,) - plus die Form der vollständig geschnittenen Achse, die auch (3,) ist. Somit ist result.shape(3, 3) und

result[i, j] = A[ind1[i], ind2[i], j] 

für i = 0,1,2 und j = 0,1,2.