webentwicklung-frage-antwort-db.com.de

Der beste Weg, ein numpy-Array zu initialisieren und zu füllen?

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?

24
tbc

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
25
shx2

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

38
JoshAdel

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
3
ryanjdillon

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 Nnp.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)
1
norok2