Jaka jest różnica między Numpy array()
a asarray()
funkcjami? Kiedy powinieneś używać jednego zamiast drugiego? Wydaje się, że generują identyczne dane wyjściowe dla wszystkich danych wejściowych, o których mogę myśleć.
Ponieważ inne pytania są przekierowywane do tego, które proszą o asanyarray
lub innych procedur tworzenia tablicy , to chyba warto mieć krótkie podsumowanie tego, co każdy z nich robi.
Różnice dotyczą głównie tego, kiedy zwracać dane wejściowe w niezmienionej postaci, a nie tworzyć nową tablicę jako kopię.
array
oferuje szeroką gamę opcji (większość innych funkcji to cienkie opakowania wokół niego), w tym flagi określające, kiedy należy skopiować. Pełne wyjaśnienie zajęłoby tyle samo co dokumenty (patrz Tworzenie macierzy , ale w skrócie, oto kilka przykładów:
Zakładamy, a
to ndarray
i m
to matrix
, i obaj mają dtype
z float32
:
np.array(a)
i np.array(m)
skopiuje oba, ponieważ jest to zachowanie domyślne.np.array(a, copy=False)
i np.array(m, copy=False)
skopiuje, m
ale nie a
, ponieważ m
nie jest ndarray
.np.array(a, copy=False, subok=True)
i np.array(m, copy=False, subok=True)
nie skopiuje żadnego, ponieważ m
jest to matrix
, która jest podklasą ndarray
.np.array(a, dtype=int, copy=False, subok=True)
skopiuje oba, ponieważ dtype
nie jest kompatybilny.Większość innych funkcji to cienkie opakowania wokół array
tej kontrolki, gdy następuje kopiowanie:
asarray
: Dane wejściowe zostaną zwrócone nieskopiowane, jeśli jest to zgodne ndarray
( copy=False
).asanyarray
: Dane wejściowe zostaną zwrócone nieskopiowane, jeśli jest to zgodne ndarray
lub podklasa taka jak matrix
( copy=False
, subok=True
).ascontiguousarray
: Dane wejściowe zostaną zwrócone bez kopiowania, jeśli jest to zgodne ndarray
w ciągłej kolejności C ( copy=False
, order='C')
.asfortranarray
: Dane wejściowe zostaną zwrócone bez kopiowania, jeśli jest to zgodne ndarray
w ciągłej kolejności Fortran ( copy=False
, order='F'
).require
: Dane wejściowe zostaną zwrócone nieskopiowane, jeśli są zgodne z określonym ciągiem wymagań.copy
: Dane wejściowe są zawsze kopiowane.fromiter
: Dane wejściowe są traktowane jako iterowalne (więc np. Możesz zbudować tablicę z elementów iteratora zamiast object
tablicy z iteratorem); zawsze kopiowane.Istnieją również funkcje wygody, takie jak asarray_chkfinite
( takie same reguły kopiowania jak asarray
, ale podnosi, ValueError
jeśli istnieją nan
lub inf
wartości) oraz konstruktory dla podklas takich jak matrix
lub w szczególnych przypadkach, takich jak tablice rekordów, i oczywiście rzeczywisty ndarray
konstruktor (który pozwala na bezpośrednie utworzenie tablicy poza krokami nad buforem).
Definicja
asarray
brzmi:Tak jest
array
, ale ma mniej opcji icopy=False
.array
macopy=True
domyślnie.Główną różnicą jest to, że
array
(domyślnie) utworzy kopię obiektu, aleasarray
nie zrobi tego, chyba że będzie to konieczne.źródło
array([1, 2, 3])
czyasarray([1, 2, 3])
?[1, 2, 3]
jest listą w języku Python, dlatego należy utworzyć kopię danych, aby utworzyćndarary
. Więc użyjnp.array
bezpośrednio zamiast tego,np.asarray
aby wysłaćcopy=False
parametr donp.array
.copy=False
Jest ignorowany, jeśli kopia musi być wykonany jak byłoby w tym przypadku. Jeśli porównamy dwa przy użyciu%timeit
IPython, zobaczysz różnicę w przypadku małych list, ale nie ma znaczenia, którego używasz w przypadku dużych list.np.asanyarray
?asarray
zawsze zwraca anndarray
.asanyarray
zwróci podklasę tegondarray
, co zostało do niej przekazane. Na przykład annp.matrix
jest podklasąndarray
.np.asanyarray(np.matrix(...))
Zwraca więc tę samą macierz, anp.asarray(np.matrix(...))
konwertuje macierz nandarray
.Różnicę można zademonstrować na tym przykładzie:
generować macierz
użyj
numpy.array
do modyfikacjiA
. Nie działa, ponieważ modyfikujesz kopięużyj
numpy.asarray
do modyfikacjiA
. To zadziałało, ponieważ modyfikująA
sięMam nadzieję że to pomoże!
źródło
Różnice są dość wyraźnie wymienione w dokumentacji
array
iasarray
. Różnice leżą w liście argumentów i stąd działanie funkcji w zależności od tych parametrów.Definicje funkcji to:
i
Następujące argumenty to te, które mogą zostać przekazane,
array
a nieasarray
wymienione w dokumentacji:źródło
Oto prosty przykład, który może wykazać różnicę.
Główną różnicą jest to, że tablica utworzy kopię oryginalnych danych i za pomocą innego obiektu możemy zmodyfikować dane w oryginalnej tablicy.
Treść w tablicy (a) pozostaje nietknięta, a mimo to możemy wykonać dowolną operację na danych przy użyciu innego obiektu bez modyfikowania zawartości w oryginalnej tablicy.
źródło
asarray(x)
jest jakarray(x, copy=False)
Użyj,
asarray(x)
gdy chcesz się upewnić, żex
będzie to tablica przed wykonaniem jakichkolwiek innych operacji. Jeślix
jest już tablicą, kopia nie zostanie wykonana. Nie spowodowałoby to zbędnego uderzenia wydajności.Oto przykład funkcji, która zapewnia
x
najpierw konwersję do tablicy.źródło