Meilleure façon d'initialiser et de remplir un tableau numpy?

je veux initialiser et remplir un numpy array. Quelle est la meilleure façon de faire?

Cela fonctionne comme je m'attends à:

>>> import numpy as np
>>> np.empty(3)
array([ -1.28822975e-231,  -1.73060252e-077,   2.23946712e-314])

Mais cela ne fonctionne pas:

>>> np.empty(3).fill(np.nan)
>>> 

Rien?

>>> type(np.empty(3))
<type 'numpy.ndarray'>

Il me semble que l' np.empty() call renvoie le type d'objet correct, donc je ne comprends pas pourquoi .fill() ne fonctionne pas?

Affectation du résultat de l' np.empty() première fonctionne très bien:

>>> a = np.empty(3)
>>> a.fill(np.nan)
>>> a
array([ nan,  nan,  nan])

Pourquoi dois-je attribuer à un variable afin d'utiliser <!--8? Est-ce que je manque une meilleure alternative?

23
demandé sur shx2 2014-03-14 23:32:15

4 réponses

np.fill modifie le tableau en place, et retourne None. Par conséquent, si vous assignez le résultat à un nom, il obtient une valeur de None.

Une alternative est d'utiliser une expression qui renvoie nan, e.g.:

a = np.empty(3) * np.nan
24
répondu shx2 2014-03-14 20:45:21

Vous pouvez également essayer:

In [79]: np.full(3, np.nan)
Out[79]: array([ nan,  nan,  nan])

pertinentes doc:

Definition: np.full(shape, fill_value, dtype=None, order='C')
Docstring:
Return a new array of given shape and type, filled with `fill_value`.

Bien que je pense que ce pourrait être seulement disponible en numpy 1.8+

36
répondu JoshAdel 2014-03-14 19:47:30

je trouve cela facile à retenir:

numpy.array([numpy.nan]*3)

par curiosité, j'ai chronométré, et les deux la réponse de@JoshAdel et la réponse de@shx2 sont beaucoup plus rapides que les miennes avec de grands réseaux.

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
2
répondu ryanjdillon 2017-05-23 12:10:30

Juste pour référence future, la multiplication par np.nan fonctionne uniquement en raison des propriétés mathématiques de np.nan. Pour une valeur générique N, il faut utiliser np.ones() * N imitant la réponse acceptée, cependant, du point de vue de la vitesse, ce n'est pas un très bon choix.

le Meilleur choix serait le np.full() comme déjà indiqué, et, si ce n'est pas disponible pour vous,np.zeros() + N semble être un meilleur choix que np.ones() * N tandis que np.empty() + N ou np.empty() * N ne conviennent tout simplement pas. Notez que np.zeros() + N également Nnp.nan.

%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)
0
répondu norok2 2017-09-25 12:30:20