Ich möchte ein numpy
-Array initialisieren und füllen. Was ist der beste Weg?
Das funktioniert wie erwartet:
>>> import numpy as np
>>> np.empty(3)
array([ -1.28822975e-231, -1.73060252e-077, 2.23946712e-314])
Aber das tut nicht:
>>> np.empty(3).fill(np.nan)
>>>
Nichts?
>>> type(np.empty(3))
<type 'numpy.ndarray'>
Mir scheint, dass der Aufruf von np.empty()
den korrekten Objekttyp zurückgibt, daher verstehe ich nicht, warum .fill()
nicht funktioniert?
Das Zuweisen des Ergebnisses von np.empty()
funktioniert zunächst einwandfrei:
>>> a = np.empty(3)
>>> a.fill(np.nan)
>>> a
array([ nan, nan, nan])
Warum muss ich eine Variable zuweisen, um np.fill()
verwenden zu können? Verpasse ich eine bessere Alternative?
np.fill
ändert das Array an Ort und Stelle und gibt None
zurück. Wenn Sie also das Ergebnis einem Namen zuweisen, erhält es den Wert None
.
Eine Alternative ist die Verwendung eines Ausdrucks, der nan
zurückgibt, z.
a = np.empty(3) * np.nan
Sie könnten auch versuchen:
In [79]: np.full(3, np.nan)
Out[79]: array([ nan, nan, nan])
Das entsprechende Dokument:
Definition: np.full(shape, fill_value, dtype=None, order='C')
Docstring:
Return a new array of given shape and type, filled with `fill_value`.
Obwohl ich denke, dass dies möglicherweise nur in numpy 1.8+ verfügbar ist
Ich finde das leicht zu merken:
numpy.array([numpy.nan]*3)
Aus Neugier habe ich es zeitlich festgelegt, und sowohl @ JoshAdels answer als auch @ shx2's Antwort sind bei großen Arrays viel schneller als meine.
In [34]: %timeit -n10000 numpy.array([numpy.nan]*10000)
10000 loops, best of 3: 273 µs per loop
In [35]: %timeit -n10000 numpy.empty(10000)* numpy.nan
10000 loops, best of 3: 6.5 µs per loop
In [36]: %timeit -n10000 numpy.full(10000, numpy.nan)
10000 loops, best of 3: 5.42 µs per loop
Nur für die zukünftige Verwendung funktioniert die Multiplikation mit np.nan
nur aufgrund der mathematischen Eigenschaften von np.nan
____. Für einen generischen Wert N
müsste man np.ones() * N
verwenden, um die akzeptierte Antwort nachzuahmen, jedoch ist dies nicht der Fall gute Wahl.
Die beste Wahl wäre np.full()
, wie bereits erwähnt, und wenn dies für Sie nicht verfügbar ist, scheint np.zeros() + N
die bessere Wahl zu sein als np.ones() * N
, während np.empty() + N
oder np.empty() * N
einfach nicht geeignet sind. Beachten Sie, dass np.zeros() + N
auch funktioniert, wenn N
np.nan
ist.
%timeit x = np.full((1000, 1000, 10), 432.4)
8.19 ms ± 97.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit x = np.zeros((1000, 1000, 10)) + 432.4
9.86 ms ± 55.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit x = np.ones((1000, 1000, 10)) * 432.4
17.3 ms ± 104 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit x = np.array([432.4] * (1000 * 1000 * 10)).reshape((1000, 1000, 10))
316 ms ± 37.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)