2012-11-05 45 views
7

Tôi đang làm việc với một mảng n chiều và tôi muốn một cách để đảo ngược thứ nguyên được đánh số. Vì vậy, chứ không phải làĐảo ngược thứ nguyên tùy ý trong một số thứ tự

rev = a[:,:,::-1] 

Tôi muốn để có thể viết

rev = a.reverse(dimension=2) 

hoặc một cái gì đó tương tự. Tôi dường như không thể tìm thấy các ví dụ không dựa vào cú pháp cũ.

+0

Nếu bạn biết cú pháp bạn cần, tại sao không cuộn cú pháp đó vào hàm 'rev' của riêng bạn? – Makoto

+0

Tôi muốn được tốt với điều đó, nhưng tôi muốn các chức năng để có một số nguyên (kích thước để đảo ngược) và trả lại mảng đảo chiều dọc theo kích thước đó. Tôi không biết làm thế nào để dịch (ví dụ) '1' thành' [:, :: - 1,:] 'và' 0' thành '[:: - 1,:,:]' cho một số tùy ý kích thước. – Shep

Trả lời

1

Đối với bất cứ ai đi ngang qua đây trong tương lai:

Numpy 1.12+ có chức năng np.flip(array, dimension), thực hiện chính xác như được yêu cầu. Thậm chí tốt hơn, nó trả về một cái nhìn của dữ liệu chứ không phải là một bản sao, và vì vậy nó xảy ra trong thời gian không đổi.

9

Nếu bạn duyệt mã nguồn numpy (python) bạn sẽ tìm thấy một mẹo mà họ sử dụng để viết các hàm hoạt động trên trục cụ thể là sử dụng np.swapaxes để đặt trục đích ở vị trí axis = 0. Sau đó, họ viết mã hoạt động trên 0-axis, và sau đó họ sử dụng np.swapaxes một lần nữa để đặt 0-axis quay lại vị trí ban đầu của nó.

Bạn có thể làm điều đó ở đây như sau:

import numpy as np 
def rev(a, axis = -1): 
    a = np.asarray(a).swapaxes(axis, 0) 
    a = a[::-1,...] 
    a = a.swapaxes(0, axis) 
    return a 

a = np.arange(24).reshape(2,3,4) 

print(rev(a, axis = 2)) 

sản lượng

[[[ 3 2 1 0] 
    [ 7 6 5 4] 
    [11 10 9 8]] 

[[15 14 13 12] 
    [19 18 17 16] 
    [23 22 21 20]]] 
6

Hóa ra điều này có thể được thực hiện với slice, mà : là viết tắt trong một số ngữ cảnh. Bí quyết là để xây dựng các đối tượng chỉ số như một tuple của lát:

import numpy as np 

def reverse(a, axis=0): 
    idx = [slice(None)]*len(a.shape) 
    idx[axis] = slice(None, None, -1) 
    return a[idx] 

a = np.arange(24).reshape(2,3,4) 
print reverse(a, axis=2) 

Với Ellipsis này có thể sụp đổ vào một lớp lót:

a[[slice(None)]*axis + [slice(None, None, -1)] + [Ellipsis]] 
+0

lát là tốt nhất! – David

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