2013-04-19 22 views
20

Tak więc w tablicach numpy jest wbudowana funkcja uzyskiwania wskaźników diagonalnych, ale nie mogę się zorientować, jak ustawić przekątną, zaczynając od prawego górnego rogu, a nie od lewego górnego rogu .Uzyskanie przeciwległej przekątnej tablicy numpy

Jest to normalny kod, aby uzyskać zaczynając od górnej lewej:

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

więc co mogę używać, jeśli chcę wrócić:

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

Odpowiedz

28

Jest

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

lub

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

Z tych dwóch, np.diag(np.fliplr(array)) jest szybsze:

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

Zacząłeś rzecz rozrządu, więc tu jest mój najlepszy strzał na uczynienie go szybko: 'krok = len (tablica) - 1; np.take (tablica, np.arange (step, array.size, step)) ' – Jaime

+0

@Jimeime: To świetnie - znacznie szybciej niż moje rozwiązanie. Być może jednak potrzebujemy 'np.arange (step, array.size-1, step)'? Proszę, zaksięguj to jako rozwiązanie, aby móc głosować. – unutbu

+1

Mam Zen Zen Pythona Tima Petersa wiszącego na mojej ścianie sześcianu, tuż przy moim monitorze. Nie mogę zaksięgować kodu komentarza jako odpowiedzi, podczas gdy ** liczy się czytelność ** patrzy na mnie ...: P Twoje rozwiązanie z 'fliplr' jest prawdopodobnie najlepsze: wystarczająco szybko i dużo, o wiele bardziej zrozumiałe, gdy ponownie je przeglądasz kilka miesięcy po napisaniu tego. – Jaime

3

Oto dwa pomysły:

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

Drugi może zrobić kopię;) – seberg