Risposte:
Dal momento che altre domande vengono reindirizzate a questa che chiede informazioni asanyarray
o altre routine di creazione di array , probabilmente vale la pena avere un breve riassunto di ciò che ciascuna di esse fa.
Le differenze riguardano principalmente quando restituire l'input invariato, invece di creare un nuovo array come copia.
array
offre una vasta gamma di opzioni (la maggior parte delle altre funzioni sono involucri sottili attorno ad esso), comprese le bandiere per determinare quando copiare. Una spiegazione completa richiederebbe tanto quanto i documenti (vedi Creazione di array , ma brevemente, ecco alcuni esempi:
Supponiamo che a
sia un ndarray
, ed m
è un matrix
, ed entrambi hanno un dtype
di float32
:
np.array(a)
e np.array(m)
copierò entrambi, perché è il comportamento predefinito.np.array(a, copy=False)
e np.array(m, copy=False)
copierò m
ma non a
, perché m
non è un ndarray
.np.array(a, copy=False, subok=True)
e np.array(m, copy=False, subok=True)
non copierò nessuno dei due, perché m
è a matrix
, che è una sottoclasse di ndarray
.np.array(a, dtype=int, copy=False, subok=True)
copierò entrambi, perché dtype
non è compatibile.La maggior parte delle altre funzioni sono involucri sottili attorno a array
quel controllo quando si verifica la copia:
asarray
: L'input verrà restituito non copiato se è compatibile ndarray
( copy=False
).asanyarray
: L'input verrà restituito non copiato se è compatibile ndarray
o sottoclasse come matrix
( copy=False
, subok=True
).ascontiguousarray
: L'input verrà restituito non copiato se è compatibile ndarray
in ordine C contiguo ( copy=False
, order='C')
.asfortranarray
: L'input verrà restituito non copiato se è compatibile ndarray
nell'ordine Fortran contiguo ( copy=False
, order='F'
).require
: L'input verrà restituito non copiato se è compatibile con la stringa dei requisiti specificata.copy
: L'input viene sempre copiato.fromiter
: L'input viene trattato come un iterabile (quindi, ad esempio, è possibile costruire un array dagli elementi di un iteratore, anziché un object
array con l'iteratore); sempre copiato.Ci sono anche funzioni di convenienza, come asarray_chkfinite
(stesse regole di copia di asarray
, ma genera ValueError
se ci sono valori nan
o inf
) e costruttori per sottoclassi come matrix
o per casi speciali come array di record e, naturalmente, il ndarray
costruttore reale (che consente di creare direttamente un array fuori passo su un buffer).
La definizione diasarray
è:
def asarray(a, dtype=None, order=None):
return array(a, dtype, copy=False, order=order)
Quindi è come array
, tranne che ha meno opzioni e copy=False
. array
hacopy=True
di default.
La differenza principale è che array
(per impostazione predefinita) farà una copia dell'oggetto, mentre asarray
non lo farà a meno che non sia necessario.
array([1, 2, 3])
o asarray([1, 2, 3])
?
[1, 2, 3]
è un elenco Python, quindi è necessario creare una copia dei dati per creare il file ndarary
. Quindi usa np.array
direttamente invece di np.asarray
quale invierebbe il copy=False
parametro a np.array
. Il copy=False
viene ignorato se una copia deve essere effettuato come sarebbe in questo caso. Se fai un benchmark dei due usando %timeit
in IPython vedrai una differenza per piccoli elenchi, ma non importa cosa usi per grandi elenchi.
np.asanyarray
?
asarray
restituisce sempre un ndarray
. asanyarray
restituirà una sottoclasse di ndarray
se questo è ciò che le è stato passato. Ad esempio, an np.matrix
è una sottoclasse di ndarray
. Quindi np.asanyarray(np.matrix(...))
restituisce la stessa matrice, mentre np.asarray(np.matrix(...))
converte la matrice in un ndarray
.
La differenza può essere dimostrata da questo esempio:
genera una matrice
>>> A = numpy.matrix(numpy.ones((3,3)))
>>> A
matrix([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.]])
usare numpy.array
per modificare A
. Non funziona perché stai modificando una copia
>>> numpy.array(A)[2]=2
>>> A
matrix([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.]])
usare numpy.asarray
per modificare A
. Ha funzionato perché si sta modificando A
se stessa
>>> numpy.asarray(A)[2]=2
>>> A
matrix([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 2., 2., 2.]])
Spero che questo ti aiuti!
Le differenze sono menzionate abbastanza chiaramente nella documentazione di array
e asarray
. Le differenze risiedono nella lista degli argomenti e quindi nell'azione della funzione in base a tali parametri.
Le definizioni delle funzioni sono:
numpy.array(object, dtype=None, copy=True, order=None, subok=False, ndmin=0)
e
numpy.asarray(a, dtype=None, order=None)
I seguenti argomenti sono quelli che possono essere passati a array
e non asarray
come indicato nella documentazione:
copy: bool, opzionale Se vero (impostazione predefinita), l'oggetto viene copiato . Altrimenti, una copia verrà effettuata solo se
__array__
restituisce una copia, se obj è una sequenza nidificata o se è necessaria una copia per soddisfare uno qualsiasi degli altri requisiti (tipo, ordine, ecc.).subok: bool, facoltativo Se True, verranno passate le sottoclassi , altrimenti l'array restituito verrà forzato ad essere un array di classe base (impostazione predefinita).
ndmin: int, opzionale Specifica il numero minimo di dimensioni che l'array risultante dovrebbe avere. Quelli saranno anticipati alla forma secondo necessità per soddisfare questo requisito.
Ecco un semplice esempio che può dimostrare la differenza.
La differenza principale è che l'array eseguirà una copia dei dati originali e utilizzando oggetti diversi possiamo modificare i dati nell'array originale.
import numpy as np
a = np.arange(0.0, 10.2, 0.12)
int_cvr = np.asarray(a, dtype = np.int64)
I contenuti nell'array (a) rimangono intatti e, tuttavia, possiamo eseguire qualsiasi operazione sui dati utilizzando un altro oggetto senza modificare il contenuto dell'array originale.
asarray(x)
è come array(x, copy=False)
Utilizzare asarray(x)
quando si desidera assicurarsi che x
sarà un array prima di eseguire qualsiasi altra operazione. Sex
è già un array, non verrà eseguita alcuna copia. Non provocherebbe un calo delle prestazioni ridondante.
Ecco un esempio di una funzione che assicura che x
venga prima convertito in un array.
def mysum(x):
return np.asarray(x).sum()