Was ist der Unterschied zwischen den Funktionen array () und asarray () von Numpy?

297

Was ist der Unterschied zwischen Numpy's array()und asarray()Funktionen? Wann sollten Sie das eine anstelle des anderen verwenden? Sie scheinen für alle Eingänge, die mir einfallen, eine identische Ausgabe zu erzeugen.

Benjamin Hodgson
quelle

Antworten:

110

Da andere Fragen an diese weitergeleitet werden, die Fragen zu asanyarrayoder andere Routinen zur Array-Erstellung stellen , lohnt es sich wahrscheinlich, eine kurze Zusammenfassung der jeweiligen Aufgaben zu haben.

Die Unterschiede bestehen hauptsächlich darin, wann die Eingabe unverändert zurückgegeben werden soll, anstatt ein neues Array als Kopie zu erstellen.

arraybietet eine Vielzahl von Optionen (die meisten anderen Funktionen sind dünne Wrapper), einschließlich Flags, um zu bestimmen, wann kopiert werden soll. Eine vollständige Erklärung würde genauso lange dauern wie die Dokumente (siehe Array-Erstellung , aber hier kurz einige Beispiele:

Angenommen, aist ein ndarrayund mist ein matrix, und beide haben ein dtypevon float32:

  • np.array(a)und np.array(m)kopiert beide, da dies das Standardverhalten ist.
  • np.array(a, copy=False)und np.array(m, copy=False)wird maber nicht kopieren a, da mist kein ndarray.
  • np.array(a, copy=False, subok=True)und np.array(m, copy=False, subok=True)wird weder kopieren, weil a mist matrix, was eine Unterklasse von ist ndarray.
  • np.array(a, dtype=int, copy=False, subok=True)kopiert beide, da das dtypenicht kompatibel ist.

Die meisten anderen Funktionen sind dünne Wrapper um arraydieses Steuerelement, wenn kopiert wird:

  • asarray: Die Eingabe wird nicht kopiert zurückgegeben, wenn sie kompatibel ist ndarray( copy=False).
  • asanyarray: Die Eingabe wird nicht kopiert zurückgegeben, wenn es sich um eine kompatible ndarrayoder Unterklasse wie matrix( copy=False, subok=True) handelt.
  • ascontiguousarray: Die Eingabe wird nicht kopiert zurückgegeben, wenn sie ndarrayin zusammenhängender C-Reihenfolge kompatibel ist ( copy=False, order='C').
  • asfortranarray: Die Eingabe wird nicht kopiert zurückgegeben, wenn sie ndarrayin zusammenhängender Fortran-Reihenfolge kompatibel ist ( copy=False, order='F').
  • require: Die Eingabe wird nicht kopiert zurückgegeben, wenn sie mit der angegebenen Anforderungszeichenfolge kompatibel ist.
  • copy: Die Eingabe wird immer kopiert.
  • fromiter: Die Eingabe wird als iterierbar behandelt (Sie können also beispielsweise ein Array aus den Elementen eines Iterators anstelle eines objectArrays mit dem Iterator erstellen). immer kopiert.

Es gibt auch Komfortfunktionen wie asarray_chkfinite(dieselben Kopierregeln wie asarray, aber erhöht, ValueErrorwenn es irgendwelche nanoder infWerte gibt) und Konstruktoren für Unterklassen wie matrixoder für Sonderfälle wie Datensatz-Arrays und natürlich den eigentlichen ndarrayKonstruktor (mit dem Sie ein Array direkt erstellen können aus Schritten über einen Puffer).

abarnert
quelle
Danke dafür, es ist sehr hilfreich
Kris
234

Die Definition vonasarray ist:

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

So ist es wie array, außer es hat weniger Optionen, und copy=False. arrayhat copy=Truestandardmäßig.

Der Hauptunterschied besteht darin, dass array(standardmäßig) eine Kopie des Objekts erstellt wird, dies asarrayjedoch nicht, sofern dies nicht erforderlich ist.

unutbu
quelle
13
Wann sollten wir also jeden verwenden? Wenn Sie ein Array von Grund auf neu erstellen, welches ist besser, array([1, 2, 3])oder asarray([1, 2, 3])?
Endolith
15
@endolith: [1, 2, 3]ist eine Python-Liste, daher muss eine Kopie der Daten erstellt werden, um die zu erstellen ndarary. Verwenden Sie also np.arraydirekt, anstatt np.asarrayden copy=FalseParameter an zu senden np.array. Das copy=Falsewird ignoriert, wenn eine Kopie wie in diesem Fall erstellt werden muss. Wenn Sie die beiden %timeitin IPython verwenden, sehen Sie einen Unterschied für kleine Listen, aber es spielt kaum eine Rolle, welche Sie für große Listen verwenden.
Unutbu
3
Das ist auch für die Methodennamen sinnvoll: "asarray": Behandeln Sie dies als Array (inplace), dh Sie ändern einfach nur Ihre Ansicht auf dieser Liste / diesem Array. "array": Konvertiert dies tatsächlich in ein neues Array.
Denvar
1
wie wäre es np.asanyarray?
Lee
3
@Lee: gibt asarrayimmer ein zurück ndarray. asanyarraygibt eine Unterklasse zurück, ndarraywenn dies der Fall ist. Zum Beispiel np.matrixist an eine Unterklasse von ndarray. So np.asanyarray(np.matrix(...))liefert die gleiche Matrix, während np.asarray(np.matrix(...))wandelt die Matrix ein ndarray.
Unutbu
114

Der Unterschied kann anhand dieses Beispiels demonstriert werden:

  1. eine Matrix erzeugen

    >>> A = numpy.matrix(numpy.ones((3,3)))
    >>> A
    matrix([[ 1.,  1.,  1.],
            [ 1.,  1.,  1.],
            [ 1.,  1.,  1.]])
  2. verwenden numpy.arrayzu ändern A. Funktioniert nicht, weil Sie eine Kopie ändern

    >>> numpy.array(A)[2]=2
    >>> A
    matrix([[ 1.,  1.,  1.],
            [ 1.,  1.,  1.],
            [ 1.,  1.,  1.]])
  3. verwenden numpy.asarrayzu ändern A. Es hat funktioniert, weil Sie sich Aselbst ändern

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

Hoffe das hilft!

Bobbie Wu
quelle
13

Die Unterschiede werden in der Dokumentation von arrayund ganz deutlich erwähnt asarray. Die Unterschiede liegen in der Argumentliste und damit in der Aktion der Funktion in Abhängigkeit von diesen Parametern.

Die Funktionsdefinitionen sind:

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

und

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

Die folgenden Argumente können weitergegeben werden arrayund nicht asarray wie in der Dokumentation erwähnt:

copy: bool, optional Wenn true (Standard), wird das Objekt kopiert . Andernfalls wird eine Kopie nur erstellt, wenn __array__eine Kopie zurückgegeben wird, wenn obj eine verschachtelte Sequenz ist oder wenn eine Kopie benötigt wird, um eine der anderen Anforderungen (Typ, Reihenfolge usw.) zu erfüllen.

subok: bool, optional Wenn True, werden Unterklassen weitergeleitet , andernfalls wird das zurückgegebene Array gezwungen, ein Basisklassenarray zu sein (Standard).

ndmin: int, optional Gibt die Mindestanzahl von Dimensionen an, die das resultierende Array haben soll. Einer wird nach Bedarf an die Form angehängt, um diese Anforderung zu erfüllen.

asheeshr
quelle
1

Hier ist ein einfaches Beispiel, das den Unterschied demonstrieren kann.

Der Hauptunterschied besteht darin, dass das Array eine Kopie der Originaldaten erstellt und mit einem anderen Objekt die Daten im Originalarray ändern können.

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

Der Inhalt in Array (a) bleibt unberührt, und dennoch können wir jede Operation an den Daten mit einem anderen Objekt ausführen, ohne den Inhalt im ursprünglichen Array zu ändern.

vivek
quelle
0

asarray(x) ist wie array(x, copy=False)

Verwenden asarray(x)Sie diese Option, wenn Sie sicherstellen möchten, dass xes sich um ein Array handelt, bevor andere Vorgänge ausgeführt werden. Wenn xes sich bereits um ein Array handelt, wird keine Kopie erstellt. Dies würde keinen redundanten Leistungseinbruch verursachen.

Hier ist ein Beispiel für eine Funktion, die sicherstellt, dass xsie zuerst in ein Array konvertiert wird.

def mysum(x):
    return np.asarray(x).sum()
off99555
quelle