Ich habe folgenden Code:
r = numpy.zeros(shape = (width, height, 9))
Es wird eine width x height x 9
Matrix mit Nullen erstellt. Stattdessen möchte ich wissen, ob es eine Funktion oder einen Weg gibt, sie auf NaN
einfache Weise zu s zu initialisieren .
np.nan
geht es schief, wenn es in int konvertiert wird.Antworten:
Sie benötigen selten Schleifen für Vektoroperationen in Numpy. Sie können ein nicht initialisiertes Array erstellen und allen Einträgen gleichzeitig zuweisen:
Ich habe die Alternativen
a[:] = numpy.nan
hier unda.fill(numpy.nan)
wie von Blaenk gepostet zeitlich festgelegt:Die Timings zeigen eine Präferenz für
ndarray.fill(..)
die schnellere Alternative. OTOH, ich mag die praktische Implementierung von numpy, bei der Sie ganzen Slices gleichzeitig Werte zuweisen können. Die Absicht des Codes ist sehr klar.Beachten Sie, dass
ndarray.fill
der Vorgang direkt ausgeführtnumpy.empty((3,3,)).fill(numpy.nan)
wird und stattdessen zurückgegeben wirdNone
.quelle
a = numpy.empty((3, 3,)) * numpy.nan
. Es war schneller als,fill
aber langsamer als die Zuweisungsmethode, aber es ist ein Oneliner !!.fill()
Methode, aber der Geschwindigkeitsunterschied verringert sich auf praktisch nichts, wenn die Arrays größer werden.np.empty([2, 5])
ein Array erstellt und dieses Array dannfill()
direkt geändert wird, aber keine Kopie oder Referenz zurückgegeben wird. Wenn Sienp.empty(2, 5)
mit einem Namen aufrufen möchten ("Zuweisen ist einer Variablen"), müssen Sie dies tun, bevor Sie direkte Operationen daran ausführen. Das Gleiche passiert, wenn Sie es tun[1, 2, 3].insert(1, 4)
. Die Liste wird erstellt und eine 4 eingefügt, es ist jedoch unmöglich, einen Verweis auf die Liste zu erhalten (und daher kann davon ausgegangen werden, dass es sich um Müll handelt). Bei unveränderlichen Daten wie Zeichenfolgen wird eine Kopie zurückgegeben, da Sie nicht direkt arbeiten können. Pandas können beides.Eine weitere Option ist die Verwendung
numpy.full
, eine Option, die in NumPy 1.8+ verfügbar istDies ist ziemlich flexibel und Sie können es mit jeder anderen Nummer füllen, die Sie möchten.
quelle
full
ist, wofür es gedacht ist.np.empy((x,y))*np.nan
ist ein guter Zweitplatzierter (und Kompatibilität für alte Versionen von numpy).fill
python -mtimeit "import numpy as np; a = np.empty((100,100));" "a.fill(np.nan)" 100000 loops, best of 3: 13.3 usec per loop python -mtimeit "import numpy as np; a = np.full((100,100), np.nan);" 100000 loops, best of 3: 18.5 usec per loop
python -mtimeit "import numpy as np; a = np.empty((1000,1000)); a.fill(np.nan)" 1000 loops, best of 3: 381 usec per loop $ python -mtimeit "import numpy as np; a = np.full((1000,1000), np.nan);" 1000 loops, best of 3: 383 usec per loop
Ich habe die vorgeschlagenen Alternativen für die Geschwindigkeit verglichen und festgestellt, dass bei ausreichend großen Vektoren / Matrizen alle Alternativen außer
val * ones
undarray(n * [val])
gleich schnell sind.Code zur Reproduktion der Handlung:
quelle
numpy.full(n, val)
ist langsamer alsa = numpy.empty(n) .. a.fill(val)
da es intern dasselbe tutKennen Sie sich aus
numpy.nan
?Sie können Ihre eigene Methode erstellen, z.
Dann
würde ausgeben
Ich habe diesen Code in einem Mailinglisten-Thread gefunden .
quelle
Sie können die Multiplikation immer verwenden, wenn Sie die Methoden
.empty
oder nicht sofort aufrufen.full
:Natürlich funktioniert es auch mit jedem anderen numerischen Wert:
Die akzeptierte Antwort von @ u0b34a0f6ae ist jedoch dreimal schneller (CPU-Zyklen, keine Gehirnzyklen, um sich an die Numpy-Syntax zu erinnern;):
quelle
Eine andere Alternative ist die,
numpy.broadcast_to(val,n)
die unabhängig von der Größe in konstanter Zeit zurückgegeben wird und außerdem am speichereffizientesten ist (sie gibt eine Ansicht des wiederholten Elements zurück). Die Einschränkung ist, dass der zurückgegebene Wert schreibgeschützt ist.Nachfolgend finden Sie einen Vergleich der Leistungen aller anderen Methoden, die unter Verwendung des gleichen Benchmarks wie in der Antwort von Nico Schlömer vorgeschlagen wurden .
quelle
Wie gesagt, numpy.empty () ist der richtige Weg. Bei Objekten kann fill () jedoch möglicherweise nicht genau das tun, was Sie denken:
Ein Weg kann zB sein:
quelle
Eine weitere Möglichkeit, die hier noch nicht erwähnt wurde, ist die Verwendung der NumPy-Kachel:
Gibt auch
Ich weiß nichts über Geschwindigkeitsvergleiche.
quelle