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?
4 réponses
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+
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
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 N
np.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)