2016-05-27 23 views
0

Ich habe eine 3D-numpy-Array und ich möchte es durch die ersten 2 Dimensionen zu partitionieren (und wählen Sie alle Elemente in der letzten). Gibt es einen einfachen Weg, wie ich das mit numpy machen kann?Splitting ND-Arrays mit numpy

Beispiel: Gegeben Array

a = array([[[ 0, 1, 2], 
     [ 3, 4, 5], 
     [ 6, 7, 8]], 

     [[ 9, 10, 11], 
     [12, 13, 14], 
     [15, 16, 17]], 

     [[18, 19, 20], 
     [21, 22, 23], 
     [24, 25, 26]]]) 

Ich mag wäre es N Wege durch die beiden ersten Achsen aufzuspalten (während alle Elemente in dem letzten Halte), zB ,:

a[0:2, 0:2, :], a[2:3, 2:3, :] 

Aber es muss nicht gleichmäßig aufgeteilt werden. Scheint wie numpy.array_split wird geteilt auf alle Achsen?

+0

Bitte stellen Sie sicher, dass Ihre Frage wie hier beschrieben ausführlicher ist: http://stackoverflow.com/help/mcve. Sie erhalten schnellere und bessere Antworten auf vollständige Fragen. – tfv

+0

Irgendwelche Beispiele? Ich bekomme nicht die Bedeutung von '(und wähle alle Elemente in der letzten)' – VICTOR

+0

Das Problem mit 'split' und' array_split' ist, dass sie nur auf 1 Achse operieren, die Ergebnisse sind eine Liste von Subarrays. – hpaulj

Antwort

0
In [179]: np.array_split(a,2,0) 
Out[179]: 
[array([[[ 0, 1, 2], 
     [ 3, 4, 5], 
     [ 6, 7, 8]], 

     [[ 9, 10, 11], 
     [12, 13, 14], 
     [15, 16, 17]]]), 
array([[[18, 19, 20], 
     [21, 22, 23], 
     [24, 25, 26]]])] 

ist die gleiche wie [a[:2,:,:], a[2:,:,:]]

könnte Sie Schleife auf diesen 2-Arrays und Split auf der nächsten Achse anwenden.

In [182]: a2=[np.array_split(aa,2,1) for aa in a1] 

In [183]: a2 # edited for clarity 
Out[183]: 
[[array([[[ 0, 1, 2], 
      [ 3, 4, 5]], 
     [[ 9, 10, 11], 
      [12, 13, 14]]]), # (2,2,3) 
    array([[[ 6, 7, 8]], 
     [[15, 16, 17]]])], # (2,1,3) 

[array([[[18, 19, 20], 
      [21, 22, 23]]]), # (1,2,3) 
    array([[[24, 25, 26]]])]] # (1,1,3) 

In [184]: a2[0][0].shape 
Out[184]: (2, 2, 3) 

In [185]: a2[0][1].shape 
Out[185]: (2, 1, 3) 

In [187]: a2[1][0].shape 
Out[187]: (1, 2, 3) 

In [188]: a2[1][1].shape 
Out[188]: (1, 1, 3) 

Mit dem Potenzial der Aufspaltung in unebenem Arrays in jeder Dimension, ist es schwer, dies in einer vollständigen vektorisiert Form zu tun. Und selbst wenn die Splits gleichmäßig waren, ist es schwierig, diese Art von Grid Splitting durchzuführen, da die Werte nicht zusammenhängend sind. In diesem Beispiel gibt es eine Lücke zwischen 5 und 9 im ersten Subarray.

0

Eine schnelle Liste Verständnis den Trick

[np.array_split(arr, 2, axis=1) 
for arr in np.array_split(a, 2, axis=0)] 

Dies in einer Liste von Listen führen, die Elemente enthalten, von denen die Arrays Sie suchen.