2012-04-07 10 views
10

Zastanawiam się, czy istnieje sposób na spłaszczenie tablicy wielowymiarowej (tj. Typu ndarray) wzdłuż zadanych osi bez wykonywania kopii w NumPy. Na przykład mam tablicę obrazów 2D i chcę spłaszczyć każdą z nich do wektora. Jednym prostym sposobem na zrobienie tego jest numpy.array([im.flatten() for im in images]), ale to powoduje utworzenie kopii każdego z nich.Jak spłaszczyć osie tablicy wielowymiarowej bez wykonywania kopii w NumPy?

Odpowiedz

12

ravel go:

>>> 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]]) 

Or reshape go:

>>> 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]]]) 

W większości przypadków te zwracają się widok na oryginalnej tablicy, zamiast kopii.

+0

Dziękujemy! 'reshape' zrobił mi sztuczkę. Myślałem, że wcześniej złamie mapowanie jeden-do-jednego pomiędzy moimi 2D matrycami i wektorami. Ale nie, zadziałało! –

7

Jeśli nie wiesz kształt swojej tablicy wejściowej:

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

-1 mówi zmienią się wypracować pozostałe wymiary. Zakłada się, że chcesz chcesz spłaszczyć pierwszą oś obrazów.

Powiązane problemy