2012-04-07 5 views
10

Ich frage mich, ob es eine Möglichkeit gibt, ein mehrdimensionales Array (d. H. Vom Typ ndarray) entlang vorgegebener Achsen zu glätten, ohne Kopien in NumPy zu erstellen. Zum Beispiel habe ich ein Array von 2D-Bildern und möchte jedes zu einem Vektor abflachen. Also, ein einfacher Weg, es zu tun ist numpy.array([im.flatten() for im in images]), aber das schafft Kopien von jedem.Wie man Achsen eines multidimensionalen Feldes glatt macht, ohne Kopien in NumPy zu machen?

Antwort

12

ravel es:

>>> a = numpy.arange(25).reshape((5, 5)) 
>>> b = a.ravel() 
>>> b[0] = 55 
>>> a 
array([[55, 1, 2, 3, 4], 
     [ 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14], 
     [15, 16, 17, 18, 19], 
     [20, 21, 22, 23, 24]]) 

Oder reshape es:

>>> a = numpy.arange(27).reshape((3, 3, 3)) 
>>> b = a.reshape((9, 3)) 
>>> b[0] = 55 
>>> a 
array([[[55, 55, 55], 
     [ 3, 4, 5], 
     [ 6, 7, 8]], 

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

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

In den meisten Fällen geben diese sowohl einen Blick auf das Original-Array, anstatt eine Kopie.

+0

Vielen Dank! 'Umgestaltung 'hat den Trick für mich getan. Ich dachte, bevor es die Eins-zu-Eins-Zuordnung zwischen meinen 2D-Matrizen und Vektoren brechen würde. Aber nein, es hat funktioniert! –

7

Wenn Sie nicht die Form des Eingangsfeldes kennen:

images.reshape((images.shape[0], -1)) 

-1 erzählt umformen die übrigen Dimensionen zu erarbeiten. Dies setzt voraus, dass Sie die erste Bildachse glätten wollen.

Verwandte Themen