Qual è la differenza tra le funzioni array () e asarray () di Numpy?


298

Qual è la differenza tra Numpy array()e le asarray()funzioni? Quando dovresti usare l'uno anziché l'altro? Sembrano generare un output identico per tutti gli input a cui riesco a pensare.

Risposte:


110

Dal momento che altre domande vengono reindirizzate a questa che chiede informazioni asanyarrayo 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.

arrayoffre 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 asia un ndarray, ed mè un matrix, ed entrambi hanno un dtypedi 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ò mma non a, perché mnon è 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é dtypenon è compatibile.

La maggior parte delle altre funzioni sono involucri sottili attorno a arrayquel 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 ndarrayo sottoclasse come matrix( copy=False, subok=True).
  • ascontiguousarray: L'input verrà restituito non copiato se è compatibile ndarrayin ordine C contiguo ( copy=False, order='C').
  • asfortranarray: L'input verrà restituito non copiato se è compatibile ndarraynell'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 objectarray con l'iteratore); sempre copiato.

Ci sono anche funzioni di convenienza, come asarray_chkfinite(stesse regole di copia di asarray, ma genera ValueErrorse ci sono valori nano inf) e costruttori per sottoclassi come matrixo per casi speciali come array di record e, naturalmente, il ndarraycostruttore reale (che consente di creare direttamente un array fuori passo su un buffer).


Grazie per questo, è molto utile
Kris

234

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. arrayhacopy=True di default.

La differenza principale è che array(per impostazione predefinita) farà una copia dell'oggetto, mentre asarraynon lo farà a meno che non sia necessario.


13
Quindi, quando dovremmo usare ciascuno? Se si crea un array da zero, quale è meglio array([1, 2, 3])o asarray([1, 2, 3])?
endolith

15
@endolith: [1, 2, 3]è un elenco Python, quindi è necessario creare una copia dei dati per creare il file ndarary. Quindi usa np.arraydirettamente invece di np.asarrayquale invierebbe il copy=Falseparametro a np.array. Il copy=Falseviene ignorato se una copia deve essere effettuato come sarebbe in questo caso. Se fai un benchmark dei due usando %timeitin IPython vedrai una differenza per piccoli elenchi, ma non importa cosa usi per grandi elenchi.
unutbu,

3
Questo ha senso anche per i nomi dei metodi: "asarray": trattalo come un array (sul posto), cioè stai semplicemente cambiando la tua vista su questo elenco / array. "array": attualmente converti questo in un nuovo array.
denvar,

1
che ne dici np.asanyarray?
Lee,

3
@Lee: asarrayrestituisce sempre un ndarray. asanyarrayrestituirà una sottoclasse di ndarrayse 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.
unutbu,

114

La differenza può essere dimostrata da questo esempio:

  1. genera una matrice

    >>> A = numpy.matrix(numpy.ones((3,3)))
    >>> A
    matrix([[ 1.,  1.,  1.],
            [ 1.,  1.,  1.],
            [ 1.,  1.,  1.]])
  2. usare numpy.arrayper 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.]])
  3. usare numpy.asarrayper modificare A. Ha funzionato perché si sta modificando Ase stessa

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

Spero che questo ti aiuti!


13

Le differenze sono menzionate abbastanza chiaramente nella documentazione di arraye 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 arraye 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.


1

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.


0

asarray(x) è come array(x, copy=False)

Utilizzare asarray(x)quando si desidera assicurarsi che xsarà 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 xvenga prima convertito in un array.

def mysum(x):
    return np.asarray(x).sum()
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.