2013-07-09 36 views
7

Tôi muốn sắp xếp lại thứ nguyên mảng của tôi. Đoạn mã sau hoạt động nhưng quá chậm.sắp xếp lại các mảng có nhiều mảng

for i in range(image_size): 
    for j in range(image_size): 
     for k in range(3): 
      new_im[k, i, j] = im[i, j, k] 

Sau này, tôi vectorize các new_im:

new_im_vec = new_im.reshape(image_size**2 * 3) 

Điều đó nói rằng, tôi không cần new_im và tôi chỉ cần để có được để new_im_vec. Có cách nào tốt hơn để làm điều này? image_size là khoảng 256.

+0

Nếu bạn đang sử dụng Python2, bạn có thể sử dụng 'xrange' thay vì' phạm vi' – jh314

Trả lời

10

Kiểm tra rollaxis, một chức năng thay đổi trục xung quanh, cho phép bạn sắp xếp lại mảng theo một lệnh. Nếu im có hình dạng i, j, k

rollaxis(im, 2) 

nên trả về một mảng với hình dạng k, i, j.

Sau đó, bạn có thể làm phẳng mảng, ravel là chức năng rõ ràng cho mục đích này. Đặt tất cả những thứ này lại với nhau, bạn có một lớp lót đẹp:

new_im_vec = ravel(rollaxis(im, 2)) 
+0

Cool! nó hoạt động. Điều khác tôi cần làm là để phản chiếu trong không gian thứ nhất. hoán đổi một [1,:,:] và [3,:,:]. Có chức năng cho việc này không? –

+1

@Mohammad Moghimi, Nếu tôi hiểu câu hỏi của bạn một cách chính xác, bạn có thể sử dụng flipud để lật mảng về trục hoành. a [:: - 1,:,:] cũng sẽ hoạt động. –

+2

+1 Có lẽ là lựa chọn tốt nhất. Để có đầy đủ, đó cũng là tùy chọn (mà tôi tin thực sự được gọi là 'np.rollaxis') khi thực hiện' np.transpose (im, (2, 0, 1)) '. Lưu ý, 'np.rollaxis' hoặc' np.transpose' trả về dạng xem của dữ liệu gốc, nhưng khi gọi flatten trên khung nhìn đó, một bản sao có thể được kích hoạt. – Jaime

7
new_im = im.swapaxes(0,2).swapaxes(1,2) # First swap i and k, then i and j 
new_im_vec = new_im.flatten() # Vectorize 

Điều này sẽ nhanh hơn nhiều vì swapaxes trả về chế độ xem trên mảng, thay vì sao chép các thành phần.

Và tất nhiên nếu bạn muốn bỏ qua new_im, bạn có thể làm điều đó trong một dòng và chỉ còn flatten đang thực hiện bất kỳ thao tác sao chép nào.

new_im_vec = im.swapaxes(0,2).swapaxes(1,2).flatten() 
Các vấn đề liên quan