438 Stimmen

Was ist der Unterschied zwischen np.array() und np.asarray()?

Was ist der Unterschied zwischen NumPy's np.array y np.asarray ? Wann sollte ich den einen und wann den anderen verwenden? Sie scheinen identische Ergebnisse zu erzeugen.

315voto

unutbu Punkte 769083

En Definition von asarray es:

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

Es ist also wie array mit dem Unterschied, dass es weniger Optionen gibt, und copy=False . array hat copy=True standardmäßig.

Der Hauptunterschied besteht darin, dass array (standardmäßig) wird eine Kopie des Objekts erstellt, während asarray nicht, es sei denn, es ist notwendig.

219voto

abarnert Punkte 332066

Da andere Fragen auf diese Frage umgeleitet werden, die sich auf asanyarray o andere Routinen zur Erstellung von Arrays Es lohnt sich wahrscheinlich, kurz zusammenzufassen, was jeder von ihnen tut.

Die Unterschiede betreffen hauptsächlich die Frage, wann die Eingabe unverändert zurückgegeben werden soll, im Gegensatz zur Erstellung eines neuen Arrays als Kopie.

array bietet eine Vielzahl von Optionen (die meisten anderen Funktionen sind dünne Wrapper um sie herum), einschließlich Flags, um zu bestimmen, wann kopiert werden soll. Eine vollständige Erklärung würde genauso viel Zeit in Anspruch nehmen wie die Dokumentationen (siehe Array-Erstellung Aber hier sind einige Beispiele:

Angenommen, a ist ein ndarray y m es un matrix und sie haben beide einen dtype de float32 :

  • np.array(a) y np.array(m) kopiert beides, denn das ist das Standardverhalten.
  • np.array(a, copy=False) y np.array(m, copy=False) kopiert m aber nicht a denn m ist kein ndarray .
  • np.array(a, copy=False, subok=True) y np.array(m, copy=False, subok=True) wird weder das eine noch das andere kopieren, denn m es un matrix , die eine Unterklasse von ndarray .
  • np.array(a, dtype=int, copy=False, subok=True) kopiert beides, denn die dtype ist nicht kompatibel.

Die meisten der anderen Funktionen sind dünne Hüllen um array die den Zeitpunkt des Kopierens steuern:

  • asarray : Die Eingabe wird unkopiert zurückgegeben, wenn es sich um eine kompatible ndarray ( copy=False ).
  • asanyarray : Die Eingabe wird unkopiert zurückgegeben, wenn es sich um eine kompatible ndarray oder Unterklassen wie matrix ( copy=False , subok=True ).
  • ascontiguousarray : Die Eingabe wird unkopiert zurückgegeben, wenn es sich um eine kompatible ndarray in fortlaufender C-Reihenfolge ( copy=False , order='C') .
  • asfortranarray : Die Eingabe wird unkopiert zurückgegeben, wenn es sich um eine kompatible ndarray in fortlaufender Fortran-Reihenfolge ( copy=False , order='F' ).
  • require : Die Eingabe wird unkopiert zurückgegeben, wenn sie mit dem angegebenen Anforderungsstring kompatibel ist.
  • copy : Die Eingabe wird immer kopiert.
  • fromiter : Die Eingabe wird als Iterable behandelt (so kann man z.B. ein Array aus den Elementen eines Iterators konstruieren, anstatt ein object Array mit dem Iterator); immer kopiert.

Es gibt auch Komfortfunktionen, wie asarray_chkfinite (dieselben Kopierregeln wie asarray sondern erhebt ValueError falls es welche gibt nan o inf Werte), und Konstruktoren für Unterklassen wie matrix oder für Sonderfälle wie Datensatzfelder, und natürlich die eigentliche ndarray Konstruktor (mit dem Sie ein Array direkt aus Strides über einen Puffer erstellen können).

154voto

Bobbie Wu Punkte 1641

Der Unterschied lässt sich an diesem Beispiel verdeutlichen:

  1. Erzeugen Sie eine Matrix.

     >>> A = numpy.matrix(numpy.ones((3, 3)))
     >>> A
     matrix([[ 1.,  1.,  1.],
             [ 1.,  1.,  1.],
             [ 1.,  1.,  1.]])
  2. Utilice numpy.array zu ändern A . Das funktioniert nicht, weil Sie eine Kopie ändern.

     >>> numpy.array(A)[2] = 2
     >>> A
     matrix([[ 1.,  1.,  1.],
             [ 1.,  1.,  1.],
             [ 1.,  1.,  1.]])
  3. Utilice numpy.asarray zu ändern A . Es hat funktioniert, weil Sie die A selbst.

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

15voto

asheeshr Punkte 4076

Die Unterschiede werden in der Dokumentation von array y asarray . Die Unterschiede liegen in der Argumentliste und damit in der Wirkung der Funktion in Abhängigkeit von diesen Parametern.

Die Funktionsdefinitionen lauten:

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

y

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

Die folgenden Argumente sind diejenigen, die an array y no asarray wie in der Dokumentation erwähnt:

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

subok : bool, optional Wenn Wahr, dann sub-c durchgereicht andernfalls die Rückgabe Array der Basisklasse sein (Voreinstellung).

ndmin : int, optional Legt den Mindestanzahl von Di das resultierende Array haben sollte. Diese werden der Form vorangestellt um diese Anforderung zu erfüllen.

5voto

off99555 Punkte 3261

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

Utilice asarray(x) wenn Sie sicherstellen wollen, dass x wird ein Array sein, bevor andere Operationen durchgeführt werden. Wenn x bereits ein Array ist, wird keine Kopie erstellt. Es würde nicht zu einem redundanten Leistungsabfall führen.

Hier ist ein Beispiel für eine Funktion, die Folgendes gewährleistet x wird zunächst in ein Array umgewandelt.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X