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ę.
python
numpy
multidimensional-array
flatten
numpy-ndarray
kryptomancja
źródło
źródło
Odpowiedzi:
Obecny interfejs API jest taki, że:
flatten
zawsze zwraca kopię.ravel
zwraca widok oryginalnej tablicy, gdy tylko jest to możliwe. Nie jest to widoczne na wydruku, ale jeśli zmodyfikujesz tablicę zwróconą przez ravel, może zmodyfikować wpisy w oryginalnej tablicy. Jeśli zmodyfikujesz wpisy w tablicy zwróconej z spłaszczenia, nigdy tak się nie stanie. ravel często będzie szybszy, ponieważ żadna pamięć nie jest kopiowana, ale musisz być bardziej ostrożny przy modyfikowaniu tablicy, którą zwraca.reshape((-1,))
dostaje widok, ilekroć pozwalają na to kroki tablicy, nawet jeśli oznacza to, że nie zawsze otrzymujesz ciągłą tablicę.źródło
a.flatten()
na pewno pobrać kopię,a.ravel()
aby uniknąć większość kopii, ale nadal gwarantuje, że zwrócona tablica jest ciągła, ia.reshape((-1,))
aby naprawdę uzyskać widok za każdym razem, gdy pozwalają na to kroki, nawet jeśli oznacza to, że nie zawsze otrzymujesz ciągłą tablicę.ravel
gwarantuje ciągłą tablicę, więc nie ma gwarancji, że zwróci widok;reshape
zawsze zwraca widok, więc nie ma gwarancji, że zwróci ciągłą tablicę.reshape(-1)
jest odpowiednikiemreshape((-1,))
Jak wyjaśniono tutaj, kluczową różnicą jest to, że:
flatten
jest metodą obiektu ndarray i dlatego można ją wywoływać tylko dla prawdziwych tablic numpy.ravel
jest funkcją na poziomie biblioteki i dlatego można ją wywoływać w każdym obiekcie, który można pomyślnie przeanalizować.Na przykład
ravel
działa na liście ndarrays, podczas gdyflatten
nie jest dostępna dla tego typu obiektu.@IanH wskazuje również w swojej odpowiedzi na ważne różnice w obsłudze pamięci.
źródło
ndarray
„sOto poprawna przestrzeń nazw dla funkcji:
numpy.ndarray.flatten
numpy.ravel
Obie funkcje zwracają spłaszczone tablice 1D wskazujące na nowe struktury pamięci.
W górnym przykładzie:
Jak sprawdzamy, czy coś jest kopią? Korzystanie z
.base
atrybutundarray
. Jeśli jest to widok, bazą będzie oryginalna tablica; jeśli jest to kopia, bazą będzieNone
.źródło