J'ai le code suivant:
r = numpy.zeros(shape = (width, height, 9))
Il crée une width x height x 9
matrice remplie de zéros. Au lieu de cela, j'aimerais savoir s'il existe une fonction ou un moyen de les initialiser à la place en NaN
s de manière simple.
np.nan
mal lorsqu'il est converti en int.Réponses:
Vous avez rarement besoin de boucles pour les opérations vectorielles dans numpy. Vous pouvez créer un tableau non initialisé et attribuer à toutes les entrées à la fois:
J'ai chronométré les alternatives
a[:] = numpy.nan
ici eta.fill(numpy.nan)
telles que publiées par Blaenk:Les horaires montrent une préférence
ndarray.fill(..)
comme alternative plus rapide. OTOH, j'aime l'implémentation pratique de numpy où vous pouvez attribuer des valeurs à des tranches entières à l'époque, l'intention du code est très claire.Notez que
ndarray.fill
effectue son opération sur place, doncnumpy.empty((3,3,)).fill(numpy.nan)
reviendra à la placeNone
.la source
a = numpy.empty((3, 3,)) * numpy.nan
. Il a chronométré plus rapidementfill
mais plus lentement que la méthode d'affectation, mais c'est un oneliner !!.fill()
méthode, mais la différence de vitesse se réduit à presque rien à mesure que les tableaux s'agrandissent.np.empty([2, 5])
crée un tableau, puisfill()
modifie ce tableau sur place, mais ne renvoie ni copie ni référence. Si vous voulez appelernp.empty(2, 5)
par un nom ("assigner à une variable"), vous devez le faire avant de faire des opérations sur place dessus. La même chose se produit si vous le faites[1, 2, 3].insert(1, 4)
. La liste est créée et un 4 est inséré, mais il est impossible d'obtenir une référence à la liste (et donc on peut supposer qu'elle a été récupérée). Sur les données immuables comme les chaînes, une copie est retournée, car vous ne pouvez pas fonctionner sur place. Les pandas peuvent faire les deux.Une autre option est d'utiliser
numpy.full
, une option disponible dans NumPy 1.8+C'est assez flexible et vous pouvez le remplir avec n'importe quel autre numéro que vous souhaitez.
la source
full
est destiné.np.empy((x,y))*np.nan
est un bon runner-up (et compatibilité pour les anciennes versions de 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
J'ai comparé les alternatives suggérées pour la vitesse et constaté que, pour des vecteurs / matrices suffisamment grands à remplir, toutes les alternatives sauf
val * ones
etarray(n * [val])
sont également rapides.Code pour reproduire l'intrigue:
la source
numpy.full(n, val)
est plus lent quea = numpy.empty(n) .. a.fill(val)
depuis car il fait la même chose en interneConnaissez-vous
numpy.nan
?Vous pouvez créer votre propre méthode telle que:
ensuite
sortirait
J'ai trouvé ce code dans un fil de discussion .
la source
Vous pouvez toujours utiliser la multiplication si vous ne vous souvenez pas immédiatement des méthodes
.empty
ou.full
:Bien sûr, cela fonctionne également avec toute autre valeur numérique:
Mais la réponse acceptée par @ u0b34a0f6ae est 3 fois plus rapide (cycles CPU, pas cycles cérébraux pour se souvenir de la syntaxe numpy;):
la source
Une autre alternative est celle
numpy.broadcast_to(val,n)
qui retourne en temps constant quelle que soit la taille et qui est également la plus efficace en mémoire (elle retourne une vue de l'élément répété). La mise en garde est que la valeur renvoyée est en lecture seule.Ci-dessous, une comparaison des performances de toutes les autres méthodes qui ont été proposées en utilisant le même benchmark que dans la réponse de Nico Schlömer .
la source
Comme dit, numpy.empty () est le chemin à parcourir. Cependant, pour les objets, fill () peut ne pas faire exactement ce que vous pensez qu'il fait:
Une solution peut être par exemple:
la source
Encore une autre possibilité non encore mentionnée ici est d'utiliser la tuile NumPy:
Donne également
Je ne connais pas la comparaison de vitesse.
la source