2012-04-07 72 views
10

Tôi tự hỏi nếu có một cách để làm phẳng mảng đa chiều (tức là, loại ndarray) dọc theo trục đã cho mà không tạo bản sao trong NumPy. Ví dụ, tôi có một loạt các hình ảnh 2D và tôi muốn san bằng từng hình ảnh một vector. Vì vậy, một cách dễ dàng để làm điều đó là numpy.array([im.flatten() for im in images]), nhưng điều đó tạo ra các bản sao của mỗi.Làm thế nào để làm phẳng trục của một mảng đa chiều mà không tạo bản sao trong NumPy?

Trả lời

12

ravel nó:

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

Hoặc reshape nó:

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

Theo hầu hết các trường hợp, những cả hai quay trở lại một cái nhìn của mảng ban đầu, chứ không phải là một bản sao.

+0

Cảm ơn bạn! 'reshape' đã làm điều đó cho tôi. Tôi nghĩ trước khi nó sẽ phá vỡ ánh xạ một-một giữa các ma trận 2D và các vectơ 2D của tôi. Nhưng không, nó hoạt động! –

7

Nếu bạn không biết hình dạng của mảng đầu vào của bạn:

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

-1 kể định hình lại để làm việc ra các kích thước còn lại. Điều này giả định rằng bạn muốn làm phẳng trục hình ảnh đầu tiên.

Các vấn đề liên quan