2017-04-26 10 views
3

Ich habe dieses Arrays:Extract Array von Arrays von Arrays

arr = np.array([[[ -1., -1., -1., 0., 0., 0.], 
       [ 0.1, 0.1, 0.1, 2., 3., 4.]], # <-- this one 

       [[ -1., -1., -1., 0., 0., -1.], 
       [ 0.1, 0.1, 0.1, 16., 17., 0.1]], # <-- and this one 

       [[ -1., -1., -1., 0., 0., 0.], 
       [ 0.1, 0.1, 0.1, 4., 5., 6.]], # <-- and this one 

       [[ 0., 0., 0., -1., 0., 0.], 
       [ 1., 2., 3., 0.1, 1., 2.]], # <-- and this one 

       [[ -1., -1., 0., 0., 0., 0.], 
       [ 0.1, 0.1, 1., 9., 10., 11.]]]) # <-- and the last one 

Ich möchte das zweite Array in jedem Array extrahieren, und das Ergebnis ist wie folgt sein:

res = [[ 0.1, 0.1, 0.1, 2., 3., 4.], 
     [ 0.1, 0.1, 0.1, 16., 17., 0.1], 
     [ 0.1, 0.1, 0.1, 4., 5., 6.], 
     [ 1., 2., 3., 0.1, 1., 2.], 
     [ 0.1, 0.1, 1., 9., 10., 11.]] 

Ich möchte die res in einer Zeile Code bekommen, habe ich versucht, dies aber nicht

funktioniert hat
arr[:][1] # select the element 1 in each array 
# I got 
array([[ -1. , -1. , -1. , 0. , 0. , -1. ], 
     [ 0.1, 0.1, 0.1, 16. , 17. , 0.1]]) 

Kann mir jemand erklären, warum? Die einzige Lösung, die ich gefunden habe, ist, jeden Index explizit anzugeben (arr[0][1]...), was ich nicht mochte.

+0

'res = [x [1] für x in arr] '? – depperm

Antwort

5

Das ist ein 3D Array und Sie versuchen, das zweite Element der zweiten Achse zu wählen und alle Elemente entlang der Rest der Achsen zu extrahieren. Also, seine so einfach wie -

arr[:,1,:] 

Wir überspringen können die : für die Hinterachsen Auflistung, so dass es weiter vereinfacht -

arr[:,1] 

Probelauf -

In [360]: arr 
Out[360]: 
array([[[ -1. , -1. , -1. , 0. , 0. , 0. ], 
     [ 0.1, 0.1, 0.1, 2. , 3. , 4. ]], 

     [[ -1. , -1. , -1. , 0. , 0. , -1. ], 
     [ 0.1, 0.1, 0.1, 16. , 17. , 0.1]], 

     [[ -1. , -1. , -1. , 0. , 0. , 0. ], 
     [ 0.1, 0.1, 0.1, 4. , 5. , 6. ]], 

     [[ 0. , 0. , 0. , -1. , 0. , 0. ], 
     [ 1. , 2. , 3. , 0.1, 1. , 2. ]], 

     [[ -1. , -1. , 0. , 0. , 0. , 0. ], 
     [ 0.1, 0.1, 1. , 9. , 10. , 11. ]]]) 

In [361]: arr[:,1] 
Out[361]: 
array([[ 0.1, 0.1, 0.1, 2. , 3. , 4. ], 
     [ 0.1, 0.1, 0.1, 16. , 17. , 0.1], 
     [ 0.1, 0.1, 0.1, 4. , 5. , 6. ], 
     [ 1. , 2. , 3. , 0.1, 1. , 2. ], 
     [ 0.1, 0.1, 1. , 9. , 10. , 11. ]]) 
+0

Herzlichen Glückwunsch! – kmario23

+1

@ kmario23 Danke! Liebend diese vielen '0's;) – Divakar

2

Ich weiß nichts über numpy, also könnte es einen einfacheren Weg dazu geben. Aber eine einfache Liste Verständnis funktionieren würde:

[a[1] for a in arr]