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.
Antworten
Zu viele Anzeigen?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.
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)
ynp.array(m)
kopiert beides, denn das ist das Standardverhalten.np.array(a, copy=False)
ynp.array(m, copy=False)
kopiertm
aber nichta
dennm
ist keinndarray
.np.array(a, copy=False, subok=True)
ynp.array(m, copy=False, subok=True)
wird weder das eine noch das andere kopieren, dennm
es unmatrix
, die eine Unterklasse vonndarray
.np.array(a, dtype=int, copy=False, subok=True)
kopiert beides, denn diedtype
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 kompatiblendarray
(copy=False
).asanyarray
: Die Eingabe wird unkopiert zurückgegeben, wenn es sich um eine kompatiblendarray
oder Unterklassen wiematrix
(copy=False
,subok=True
).ascontiguousarray
: Die Eingabe wird unkopiert zurückgegeben, wenn es sich um eine kompatiblendarray
in fortlaufender C-Reihenfolge (copy=False
,order='C')
.asfortranarray
: Die Eingabe wird unkopiert zurückgegeben, wenn es sich um eine kompatiblendarray
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 einobject
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).
Der Unterschied lässt sich an diesem Beispiel verdeutlichen:
-
Erzeugen Sie eine Matrix.
>>> A = numpy.matrix(numpy.ones((3, 3))) >>> A matrix([[ 1., 1., 1.], [ 1., 1., 1.], [ 1., 1., 1.]])
-
Utilice
numpy.array
zu ändernA
. Das funktioniert nicht, weil Sie eine Kopie ändern.>>> numpy.array(A)[2] = 2 >>> A matrix([[ 1., 1., 1.], [ 1., 1., 1.], [ 1., 1., 1.]])
-
Utilice
numpy.asarray
zu ändernA
. Es hat funktioniert, weil Sie dieA
selbst.>>> numpy.asarray(A)[2] = 2 >>> A matrix([[ 1., 1., 1.], [ 1., 1., 1.], [ 2., 2., 2.]])
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.
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()
- See previous answers
- Weitere Antworten anzeigen