Jaka jest różnica między funkcjami tablicy Numpy () a funkcjami asarray ()?

297

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ć.

Benjamin Hodgson
źródło

Odpowiedzi:

110

Ponieważ inne pytania są przekierowywane do tego, które proszą o asanyarraylub 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ę.

arrayoferuje 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, ato ndarrayi mto matrix, i obaj mają dtypez 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, male nie a, ponieważ mnie jest ndarray.
  • np.array(a, copy=False, subok=True)i np.array(m, copy=False, subok=True)nie skopiuje żadnego, ponieważ mjest to matrix, która jest podklasą ndarray.
  • np.array(a, dtype=int, copy=False, subok=True)skopiuje oba, ponieważ dtypenie jest kompatybilny.

Większość innych funkcji to cienkie opakowania wokół arraytej 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 ndarraylub podklasa taka jak matrix( copy=False, subok=True).
  • ascontiguousarray: Dane wejściowe zostaną zwrócone bez kopiowania, jeśli jest to zgodne ndarrayw ciągłej kolejności C ( copy=False, order='C').
  • asfortranarray: Dane wejściowe zostaną zwrócone bez kopiowania, jeśli jest to zgodne ndarrayw 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 objecttablicy z iteratorem); zawsze kopiowane.

Istnieją również funkcje wygody, takie jak asarray_chkfinite( takie same reguły kopiowania jak asarray, ale podnosi, ValueErrorjeśli istnieją nanlub infwartości) oraz konstruktory dla podklas takich jak matrixlub w szczególnych przypadkach, takich jak tablice rekordów, i oczywiście rzeczywisty ndarraykonstruktor (który pozwala na bezpośrednie utworzenie tablicy poza krokami nad buforem).

abarnert
źródło
Dzięki za to jest bardzo pomocne
Kris
234

Definicjaasarray brzmi:

def asarray(a, dtype=None, order=None):
    return array(a, dtype, copy=False, order=order)

Tak jest array, ale ma mniej opcji i copy=False. arrayma copy=Truedomyślnie.

Główną różnicą jest to, że array(domyślnie) utworzy kopię obiektu, ale asarraynie zrobi tego, chyba że będzie to konieczne.

unutbu
źródło
13
Kiedy więc powinniśmy użyć każdego z nich? Jeśli tworzysz tablicę od zera, co jest lepsze, array([1, 2, 3])czy asarray([1, 2, 3])?
endolith
15
@endolith: [1, 2, 3]jest listą w języku Python, dlatego należy utworzyć kopię danych, aby utworzyć ndarary. Więc użyj np.arraybezpośrednio zamiast tego, np.asarrayaby wysłać copy=Falseparametr do np.array. copy=FalseJest ignorowany, jeśli kopia musi być wykonany jak byłoby w tym przypadku. Jeśli porównamy dwa przy użyciu %timeitIPython, zobaczysz różnicę w przypadku małych list, ale nie ma znaczenia, którego używasz w przypadku dużych list.
unutbu
3
Ma to również sens w nazwach metod: „asarray”: Traktuj to jak tablicę (na miejscu), tzn. Po prostu zmieniasz swój widok na tej liście / tablicy. „tablica”: w rzeczywistości przekonwertuj to na nową tablicę.
denvar
1
jak o np.asanyarray?
Lee
3
@Lee: asarrayzawsze zwraca an ndarray. asanyarrayzwróci podklasę tego ndarray, co zostało do niej przekazane. Na przykład an np.matrixjest podklasą ndarray. np.asanyarray(np.matrix(...))Zwraca więc tę samą macierz, a np.asarray(np.matrix(...))konwertuje macierz na ndarray.
unutbu
113

Różnicę można zademonstrować na tym przykładzie:

  1. generować macierz

    >>> A = numpy.matrix(numpy.ones((3,3)))
    >>> A
    matrix([[ 1.,  1.,  1.],
            [ 1.,  1.,  1.],
            [ 1.,  1.,  1.]])
  2. użyj numpy.arraydo modyfikacji A. Nie działa, ponieważ modyfikujesz kopię

    >>> numpy.array(A)[2]=2
    >>> A
    matrix([[ 1.,  1.,  1.],
            [ 1.,  1.,  1.],
            [ 1.,  1.,  1.]])
  3. użyj numpy.asarraydo modyfikacji A. To zadziałało, ponieważ modyfikują Asię

    >>> numpy.asarray(A)[2]=2
    >>> A
    matrix([[ 1.,  1.,  1.],
            [ 1.,  1.,  1.],
            [ 2.,  2.,  2.]])

Mam nadzieję że to pomoże!

Bobbie Wu
źródło
13

Różnice są dość wyraźnie wymienione w dokumentacji arrayi asarray. 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:

numpy.array(object, dtype=None, copy=True, order=None, subok=False, ndmin=0)

i

numpy.asarray(a, dtype=None, order=None)

Następujące argumenty to te, które mogą zostać przekazane, arraya nie asarray wymienione w dokumentacji:

copy: bool, opcjonalne Jeśli true (domyślnie), wówczas obiekt jest kopiowany . W przeciwnym razie kopia zostanie wykonana tylko wtedy, gdy __array__zwróci kopię, jeśli obj jest sekwencją zagnieżdżoną lub jeśli kopia jest potrzebna, aby spełnić inne wymagania (typ, kolejność itp.).

subok: bool, opcjonalne Jeśli True, wówczas podklasy zostaną przekazane , w przeciwnym razie zwrócona tablica będzie zmuszona do bycia tablicą klasy podstawowej (domyślnie).

ndmin: int, opcjonalne Określa minimalną liczbę wymiarów, jaką powinna mieć tablica wynikowa . Te zostaną wstępnie dopasowane do kształtu, aby spełnić ten wymóg.

asheeshr
źródło
1

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.

import numpy as np
a = np.arange(0.0, 10.2, 0.12)
int_cvr = np.asarray(a, dtype = np.int64)

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.

vivek
źródło
0

asarray(x) jest jak array(x, copy=False)

Użyj, asarray(x)gdy chcesz się upewnić, że xbędzie to tablica przed wykonaniem jakichkolwiek innych operacji. Jeśli xjest już tablicą, kopia nie zostanie wykonana. Nie spowodowałoby to zbędnego uderzenia wydajności.

Oto przykład funkcji, która zapewnia xnajpierw konwersję do tablicy.

def mysum(x):
    return np.asarray(x).sum()
off99555
źródło