Wierzcie lub nie, po wyprofilowaniu mojego obecnego kodu powtarzające się operacje odwracania tablicy numpy zjadły ogromną część czasu pracy. To, co mam teraz, to wspólna metoda oparta na widoku:
reversed_arr = arr[::-1]
Czy jest jakiś inny sposób, aby zrobić to bardziej efektywnie, czy to tylko złudzenie mojej obsesji na punkcie nierealistycznego numpicznego wykonania?
arr[::-1]
po prostu zwraca odwrócony widok. Jest tak szybki, jak to tylko możliwe, i nie zależy od liczby elementów w tablicy, ponieważ po prostu zmienia kroki. Czy to, co cofasz, faktycznie jest tablicą liczb liczbowych?arr
jest tablicą numpy.f2py
jest twoim przyjacielem! Często warto pisać krytyczne pod względem wydajności części algorytmu (szczególnie w obliczeniach naukowych) w innym języku i wywoływać go z języka python. Powodzenia!arr[::-1]
: github.com/numpy/numpy/blob/master/numpy/lib/twodim_base.py . Szukaćdef flipud
. Funkcja ma dosłownie cztery linie.Odpowiedzi:
Podczas tworzenia
reversed_arr
tworzysz widok do oryginalnej tablicy. Następnie możesz zmienić oryginalną tablicę, a widok zostanie zaktualizowany, aby odzwierciedlić zmiany.Czy odtwarzasz widok częściej niż potrzebujesz? Powinieneś być w stanie zrobić coś takiego:
Nie jestem ekspertem od numpy, ale wydaje się, że byłby to najszybszy sposób na robienie tego w numpy. Jeśli to właśnie robisz, nie sądzę, że możesz to poprawić.
PS Świetna dyskusja na temat wielu wyświetleń tutaj:
Zobacz na tablicę numpy?
źródło
look_at
funkcja ma pełnić?reversed_arr
jest nadal użyteczny po zmianie danych podstawowych. Zapisanie nowych wartości w tablicy nie unieważnia widoku. W rzeczywistości można również użyć widoku do zapisania nowych wartości w tablicy.reversed_arr[0] = 99
ustawiłby ostatni element w tablicy na 99, tak samo jakarr[-1] = 99
zrobiłby.Jak wspomniano powyżej,
a[::-1]
tak naprawdę tworzy tylko widok, więc jest to operacja o stałym czasie (i jako taka nie trwa dłużej, gdy tablica się powiększa). Jeśli potrzebujesz, aby tablica była ciągła (na przykład ponieważ wykonujesz z nią wiele operacji wektorowych),ascontiguousarray
jest ona tak szybka jakflipup
/fliplr
:Kod do wygenerowania wykresu:
źródło
Ponieważ wydaje się, że nie jest to jeszcze oznaczone jako odpowiedź ... Odpowiedź Thomasa Arildsena powinna być właściwa: po prostu użyj
jeśli jest to tablica 1d (tablica kolumnowa).
Z matrize zrobić
jeśli chcesz odwrócić wiersze i
flipud(matrix)
jeśli chcesz odwrócić kolumny. Nie ma potrzeby przekształcania tablicy 1d w 2-wymiarową tablicę wierszy (macierz z jedną warstwą Brak), a następnie odwracanie jej.źródło
np.fliplr()
odwraca tablicę od lewej do prawej.Pamiętaj, że w przypadku tablic 1d musisz trochę oszukać:
źródło
reversed_arr = np.flipud(arr1d)
wydaje się działać bezpośrednio.Rozbuduję wcześniejszą odpowiedź na temat
np.fliplr()
. Oto kod ilustrujący tworzenie tablicy 1d, przekształcanie jej w tablicę 2d, odwracanie, a następnie konwersję z powrotem do tablicy 1d.time.clock()
zostaną wykorzystane do zachowania czasu, który jest wyrażony w sekundach.Bez instrukcji drukowania:
Z wypisanym komentarzem:
Pod względem wydajności uważam, że to przyzwoite. Dla tych z was, którzy lubią to robić w jednym wierszu, oto ta forma.
źródło
Rozwijając to, co powiedzieli inni, dam krótki przykład.
Jeśli masz tablicę 1D ...
Ale jeśli pracujesz z tablicą 2D ...
To nie odwraca Matrycy.
Powinien użyć np.flip do odwrócenia elementów
Jeśli chcesz wydrukować elementy matrycy jeden po drugim, użyj płaskiego wraz z przerzuceniem
źródło
Aby działał z liczbami ujemnymi i długą listą, możesz wykonać następujące czynności:
Gdzie flipud jest dla tablicy 1d
źródło