2013-04-19 29 views
20

Vì vậy, trong mảng có nhiều mảng có chức năng được xây dựng để nhận chỉ báo chéo, nhưng tôi không thể tìm ra cách để có được đường chéo bắt đầu từ trên cùng bên phải thay vì trên cùng bên trái .nhận được đường chéo đối diện của mảng numpy

Đây là mã bình thường để có được bắt đầu từ phía trên bên trái:

>>> import numpy as np 
>>> array = np.arange(25).reshape(5,5) 
>>> diagonal = np.diag_indices(5) 
>>> array 
array([[ 0, 1, 2, 3, 4], 
    [ 5, 6, 7, 8, 9], 
    [10, 11, 12, 13, 14], 
    [15, 16, 17, 18, 19], 
    [20, 21, 22, 23, 24]]) 
>>> array[diagonal] 
array([ 0, 6, 12, 18, 24]) 

vì vậy những gì để tôi sử dụng nếu tôi muốn nó trở lại:

array([ 4, 8, 12, 16, 20]) 

Trả lời

28

In [47]: np.diag(np.fliplr(array)) 
Out[47]: array([ 4, 8, 12, 16, 20]) 

hoặc

In [48]: np.diag(np.rot90(array)) 
Out[48]: array([ 4, 8, 12, 16, 20]) 

Trong hai, np.diag(np.fliplr(array)) là nhanh hơn:

In [50]: %timeit np.diag(np.fliplr(array)) 
100000 loops, best of 3: 4.29 us per loop 

In [51]: %timeit np.diag(np.rot90(array)) 
100000 loops, best of 3: 6.09 us per loop 
+3

Bạn bắt đầu điều thời gian, vì vậy đây là bức ảnh đẹp nhất của tôi lúc làm cho nó nhanh: 'bước = len (mảng) - 1; np.take (mảng, np.arange (bước, array.size, bước)) ' – Jaime

+0

@Jaime: Tuyệt vời - nhanh hơn nhiều so với giải pháp của tôi. Có lẽ chúng ta cần 'np.arange (step, array.size-1, step)' tuy nhiên? Hãy đăng nó như một giải pháp để tôi có thể bỏ phiếu. – unutbu

+1

Tôi có Tim The Zen of Python treo trên tường lập phương của tôi, chỉ cần tắt màn hình của tôi. Tôi không thể đăng mã của bình luận như một câu trả lời trong khi ** khả năng đọc ** đang nhìn vào tôi ...: P Giải pháp của bạn với 'fliplr' có lẽ là tốt nhất: đủ nhanh và nhiều, dễ hiểu hơn nhiều khi bạn truy cập lại nó một vài tháng sau khi viết nó. – Jaime

3

Dưới đây là hai ý tưởng:

step = len(array) - 1 

# This will make a copy 
array.flat[step:-step:step] 

# This will make a veiw 
array.ravel()[step:-step:step] 
+0

Thứ hai có thể tạo một bản sao;) – seberg

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