Odpowiedzi:
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).
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
. array
ma copy=True
domyślnie.
Główną różnicą jest to, że array
(domyślnie) utworzy kopię obiektu, ale asarray
nie zrobi tego, chyba że będzie to konieczne.
array([1, 2, 3])
czy asarray([1, 2, 3])
?
[1, 2, 3]
jest listą w języku Python, dlatego należy utworzyć kopię danych, aby utworzyć ndarary
. Więc użyj np.array
bezpośrednio zamiast tego, np.asarray
aby wysłać copy=False
parametr do np.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 an ndarray
. asanyarray
zwróci podklasę tego ndarray
, co zostało do niej przekazane. Na przykład an np.matrix
jest podklasą ndarray
. np.asanyarray(np.matrix(...))
Zwraca więc tę samą macierz, a np.asarray(np.matrix(...))
konwertuje macierz na ndarray
.
Różnicę można zademonstrować na tym przykładzie:
generować macierz
>>> A = numpy.matrix(numpy.ones((3,3)))
>>> A
matrix([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.]])
użyj numpy.array
do modyfikacji A
. Nie działa, ponieważ modyfikujesz kopię
>>> numpy.array(A)[2]=2
>>> A
matrix([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.]])
użyj numpy.asarray
do modyfikacji A
. To zadziałało, ponieważ modyfikują A
się
>>> numpy.asarray(A)[2]=2
>>> A
matrix([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 2., 2., 2.]])
Mam nadzieję że to pomoże!
Różnice są dość wyraźnie wymienione w dokumentacji array
i 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, array
a 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.
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.
asarray(x)
jest jak array(x, copy=False)
Użyj, asarray(x)
gdy chcesz się upewnić, że x
będzie to tablica przed wykonaniem jakichkolwiek innych operacji. Jeśli x
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.
def mysum(x):
return np.asarray(x).sum()