2016-01-05 16 views
5

Tôi có một mảng 5D 'a', có kích thước (3,2,2,2,2).Xoay một mảng 5D trong 2 kích thước cuối cùng

import numpy as np 
a = np.arange(48).reshape(3,2,2,2,2) 
a[0,0,0]: 
array([[0, 1], 
     [2, 3]]) 

Điều tôi muốn làm là xoay mảng 5D này 180 độ, nhưng chỉ ở hai kích thước cuối cùng mà không thay đổi vị trí của chúng. Vì vậy, sản lượng [0,0,0] sẽ giống như sau:

out[0,0,0]: 
array([[3, 2], 
     [1, 0]]) 

Những gì tôi đã cố gắng:

out = np.rot90(a, 2) 
out[0,0,0]: 
array([[40, 41], 
     [42, 43]]) 

Chức năng rot90 dường như xoay toàn bộ mảng.

Lưu ý: Tôi muốn tránh sử dụng cho vòng lặp nếu có thể

Trả lời

2

Để xoay hai trục trước 180 độ, vượt qua axes=(-2, -1)-np.rot90:

>>> a180 = np.rot90(a, 2, axes=(-2, -1)) 
>>> a180[0, 0, 0] 
array([[3, 2], 
     [1, 0]]) 

Nếu phiên bản của NumPy không có tham số axes với np.rot90, có là lựa chọn thay thế.

Một cách là với lập chỉ mục:

a180 = a[..., ::-1, ::-1] 

rot90 flips các đầu tiên hai trục của mảng, do đó để sử dụng nó, bạn sẽ cần phải transpose (để đảo ngược các trục), xoay, và transpose quay lại lần nữa. Ví dụ:

np.rot90(a.T, 2).T 
+0

Cảm ơn bạn. Không phải vậy. – Babak

1

Nếu tôi hiểu câu hỏi một cách chính xác, bạn có thể đảo ngược sự sắp xếp của các yếu tố dọc theo hai trục trước, như vậy -

a[:,:,::-1,::-1] 

Bạn cũng có thể định hình lại để một mảng 2D sáp nhập hai trục trước khi trục trước, sau đó đảo ngược yếu tố cùng nó và định hình lại trở lại, như vậy -

.210

mẫu chạy -

In [141]: a[0][0] 
Out[141]: 
array([[57, 64, 69], 
     [41, 28, 89]]) 

In [142]: out1 = a[:,:,::-1,::-1] 

In [143]: out2 = a.reshape(-1,np.prod(a.shape[-2:]))[:,::-1].reshape(a.shape) 

In [144]: out1[0][0] 
Out[144]: 
array([[89, 28, 41], 
     [69, 64, 57]]) 

In [145]: out2[0][0] 
Out[145]: 
array([[89, 28, 41], 
     [69, 64, 57]]) 
Các vấn đề liên quan