2017-03-25 6 views
2

Ich überprüfte die Numpy docs und s.o. zu diesem Thema, aber ich konnte keine Antwort finden. Vielleicht kann es nicht gemacht werden.Mehrdimensionale Indizierung in Numpy

Grundsätzlich habe ich ein Array probabilities der Form (3,4,5). In der dritten Dimension gibt es 5 Elemente, die zusammen 1 ergeben. Der Elementindex in der dritten Dimension, den ich möchte, entspricht den Werten im Array index der Form (3,4). Macht Sinn?

Also, wenn probabilities[0,0,:]-[0.1, 0.1, 0.2, 0.4, 0.2] und index[0,0] gleich ist, gleich 2, dann will ich das dritte Element, das 0.2 ist.

Ich versuchte probabilities[index] und andere Dinge, aber kein Glück.

Kann dies ohne eine Schleife erfolgen?

Antwort

3

eine Probe Array Marke:

In [291]: A = np.arange(2*3*4).reshape(2,3,4) 
In [292]: A[0,0,:] 
Out[292]: array([0, 1, 2, 3]) 
In [293]: A[0,0,2] 
Out[293]: 2 

eine Probe idx Marke:

In [294]: idx = np.random.randint(0,4,(2,3),int) 
In [295]: idx 
Out[295]: 
array([[0, 3, 0], 
     [1, 0, 1]]) 

Diese Indexwerte für die 3. Dimension sind. Make-Arrays für die Indizierung auf den ersten 2 Dimensionen:

In [299]: I,J=np.ix_(np.arange(A.shape[0]),np.arange(A.shape[1])) 
In [300]: I,J 
Out[300]: 
(array([[0], 
     [1]]), array([[0, 1, 2]])) 
In [301]: A[I,J,idx] 
Out[301]: 
array([[ 0, 7, 8], 
     [13, 16, 21]]) 

Test:

In [302]: A[0,1,3] 
Out[302]: 7 
In [304]: A[1,2,1] 
Out[304]: 21 

Es gibt verschiedene Möglichkeiten, jene I,J bekommen. np.ix_ ist ein einfacher. So ist np.ogrid, np.mgrid oder sogar np.meshgrid.

In [306]: I,J = np.mgrid[0:2,0:3] 
In [307]: I,J 
Out[307]: 
(array([[0, 0, 0], 
     [1, 1, 1]]), array([[0, 1, 2], 
     [0, 1, 2]])) 
In [308]: A[I,J,idx] 
Out[308]: 
array([[ 0, 7, 8], 
     [13, 16, 21]]) 
+0

Ich bin beeindruckt. Schön gemacht. – vega

Verwandte Themen