2015-03-08 14 views
150
import numpy as np 
y = np.array(((1,2,3),(4,5,6),(7,8,9))) 
OUTPUT: 
print(y.flatten()) 
[1 2 3 4 5 6 7 8 9] 
print(y.ravel()) 
[1 2 3 4 5 6 7 8 9] 

Obie funkcje zwracają tę samą listę. Więc jaka jest potrzeba dwóch różnych funkcji wykonujących tę samą pracę.Jaka jest różnica między funkcjami spłaszczania i ravel w numpy?

+10

Ravel zwykle zwraca widok do istniejącej tablicy (czasami zwraca kopię). Flatten zwraca nową tablicę. – Alex

+3

Możliwy duplikat [Jaka jest różnica między spłaszczaniem a ravel w numpy?] (Http://stackoverflow.com/questions/28837312/what-is-the-difference-between-flatten-and-ravel-in-numpy) – finnw

Odpowiedz

207

Obecny API jest, że:

  • flatten zawsze zwraca kopię.
  • ravel zwraca widok oryginalnej tablicy, gdy tylko jest to możliwe. Nie jest to widoczne na wydrukach, ale jeśli zmodyfikujesz tablicę zwróconą przez Ravel, może zmodyfikować wpisy w oryginalnej tablicy. Jeśli zmodyfikujesz wpisy w tablicy zwróconej od spłaszczenia, to nigdy się nie stanie. Ravel będzie często szybszy, ponieważ żadna pamięć nie zostanie skopiowana, ale musisz być ostrożniejszy w modyfikowaniu zwracanej tablicy.
  • reshape((-1,)) otrzymuje widok, gdy tylko kroki tablicy pozwalają na to, nawet jeśli oznacza to, że nie zawsze otrzymujesz ciągłą tablicę.
+10

Każdy pomysł, dlaczego programiści NumPy nie trzymali się jednej funkcji z kopiowaniem parametrów = [prawda, fałsz]? –

+0

@FranckDernoncourt Świetne pytanie. Nie mam pojęcia. Jedynym powodem, dla którego mogę myśleć, jest zapewnienie łatwego analogu do podobnego polecenia matlaba. Wygląda na to, że nie ma precedensu w numarray lub numeric. – IanH

+18

Gwarancje Backcompat czasami powodują takie dziwne rzeczy. Na przykład: programiści numpy ostatnio (w wersji 1.10) dodali wcześniej niejawną gwarancję, że Ravel zwróci ciągłą tablicę (właściwość, która jest bardzo ważna przy pisaniu rozszerzeń C), więc teraz API to 'a.flatten()', aby uzyskać kopia na pewno, 'a.ravel()', aby uniknąć większości kopii, ale nadal gwarantuje, że zwrócona tablica jest ciągła, i 'a.reshape ((- 1,))' aby naprawdę uzyskać widok za każdym razem gdy kroki w macierzy pozwól na to, nawet jeśli oznacza to, że nie zawsze uzyskujesz ciągłą tablicę. – IanH

13

Jak wyjaśniono here kluczową różnicą jest to, że jest to metoda flatten o ndarray obiektu, a tym samym może być wywołana tylko dla prawdziwych tablic numpy. Natomiast ravel() jest funkcją na poziomie biblioteki, a zatem można ją wywołać na dowolnym obiekcie, który może zostać pomyślnie przeanalizowany. Na przykład ravel() będzie działać na liście ndarrays, a spłaszczanie nie jest dostępne dla tego typu obiektu.

@IanH także wskazuje na istotne różnice w obsłudze pamięci w swojej odpowiedzi.

Powiązane problemy