Antworten:
Da andere Fragen an diese weitergeleitet werden, die Fragen zu asanyarray
oder 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.
array
bietet 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, a
ist ein ndarray
und m
ist ein matrix
, und beide haben ein dtype
von 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 m
aber nicht kopieren a
, da m
ist kein ndarray
.np.array(a, copy=False, subok=True)
und np.array(m, copy=False, subok=True)
wird weder kopieren, weil a m
ist matrix
, was eine Unterklasse von ist ndarray
.np.array(a, dtype=int, copy=False, subok=True)
kopiert beide, da das dtype
nicht kompatibel ist.Die meisten anderen Funktionen sind dünne Wrapper um array
dieses 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 ndarray
oder Unterklasse wie matrix
( copy=False
, subok=True
) handelt.ascontiguousarray
: Die Eingabe wird nicht kopiert zurückgegeben, wenn sie ndarray
in zusammenhängender C-Reihenfolge kompatibel ist ( copy=False
, order='C')
.asfortranarray
: Die Eingabe wird nicht kopiert zurückgegeben, wenn sie ndarray
in 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 object
Arrays mit dem Iterator erstellen). immer kopiert.Es gibt auch Komfortfunktionen wie asarray_chkfinite
(dieselben Kopierregeln wie asarray
, aber erhöht, ValueError
wenn es irgendwelche nan
oder inf
Werte gibt) und Konstruktoren für Unterklassen wie matrix
oder für Sonderfälle wie Datensatz-Arrays und natürlich den eigentlichen ndarray
Konstruktor (mit dem Sie ein Array direkt erstellen können aus Schritten über einen Puffer).
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
. array
hat copy=True
standardmäßig.
Der Hauptunterschied besteht darin, dass array
(standardmäßig) eine Kopie des Objekts erstellt wird, dies asarray
jedoch nicht, sofern dies nicht erforderlich ist.
array([1, 2, 3])
oder asarray([1, 2, 3])
?
[1, 2, 3]
ist eine Python-Liste, daher muss eine Kopie der Daten erstellt werden, um die zu erstellen ndarary
. Verwenden Sie also np.array
direkt, anstatt np.asarray
den copy=False
Parameter an zu senden np.array
. Das copy=False
wird ignoriert, wenn eine Kopie wie in diesem Fall erstellt werden muss. Wenn Sie die beiden %timeit
in IPython verwenden, sehen Sie einen Unterschied für kleine Listen, aber es spielt kaum eine Rolle, welche Sie für große Listen verwenden.
np.asanyarray
?
asarray
immer ein zurück ndarray
. asanyarray
gibt eine Unterklasse zurück, ndarray
wenn dies der Fall ist. Zum Beispiel np.matrix
ist 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
.
Der Unterschied kann anhand dieses Beispiels demonstriert werden:
eine Matrix erzeugen
>>> A = numpy.matrix(numpy.ones((3,3)))
>>> A
matrix([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.]])
verwenden numpy.array
zu ä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.]])
verwenden numpy.asarray
zu ändern A
. Es hat funktioniert, weil Sie sich A
selbst ändern
>>> numpy.asarray(A)[2]=2
>>> A
matrix([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 2., 2., 2.]])
Hoffe das hilft!
Die Unterschiede werden in der Dokumentation von array
und 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 array
und 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.
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.
asarray(x)
ist wie array(x, copy=False)
Verwenden asarray(x)
Sie diese Option, wenn Sie sicherstellen möchten, dass x
es sich um ein Array handelt, bevor andere Vorgänge ausgeführt werden. Wenn x
es 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 x
sie zuerst in ein Array konvertiert wird.
def mysum(x):
return np.asarray(x).sum()