Créer numpy matrice remplie avec NaNs
J'ai le code suivant:
r = numpy.zeros(shape = (width, height, 9))
Il crée un width x height x 9
matrice rempli avec des zéros. Au lieu de cela, je voudrais savoir si il existe une fonction ou une façon de les initialiser à la place de NaN
s dans un moyen facile.
- Une mise en garde est que NumPy n'ont pas un nombre entier NA de valeur (contrairement à R). Voir pandas liste des erreurs. Donc
np.nan
se passe mal lors de la conversion de int. - smci est droit. Pour NumPy il n'y a pas une telle valeur NaN. Donc, cela dépend du type et de la sur NumPy dont la valeur sera là pour NaN. Si vous n'êtes pas conscient de cela, cela va causer des ennuis
Vous devez vous connecter pour publier un commentaire.
Vous aurez rarement besoin de boucles pour les opérations de numpy.
Vous pouvez créer un tableau non initialisé et de céder à toutes les entrées à la fois:
J'ai chronométré les alternatives
a[:] = numpy.nan
ici eta.fill(numpy.nan)
posté par Blaenk:Les horaires indiquent une préférence pour les
ndarray.fill(..)
comme l'alternative plus rapide. Otoh, que, j'aime numpy la commodité de mise en œuvre de l'endroit où vous pouvez affecter des valeurs à l'ensemble de tranches à la fois, le code de l'intention est très claire.a = numpy.empty((3, 3,)) * numpy.nan
. Il chronométrés plus vite quefill
mais plus lente que la méthode d'affectation, mais c'est un oneliner!!.fill()
méthode, mais la différence de vitesse réduit à presque rien comme les tableaux sont de plus en plus.np.empty([2, 5]).fill(np.nan)
? Cela renvoieNone
, et je ne sais pas pourquoi...np.empty([2, 5])
crée un tableau, puisfill()
modifie la matrice en place, mais ne retourne pas une copie ou une référence. Si vous voulez l'appelernp.empty(2, 5)
par un nom ("associer à une variable"), vous devez le faire avant de le faire sur place les opérations sur elle. Même genre de chose se produit si vous ne[1, 2, 3].insert(1, 4)
. La liste est créée et un 4 est insérée, mais il est impossible d'obtenir une référence à la liste (et donc il peut être supposé que le garbage collector). Sur les données immuables comme les cordes, un exemplaire est retourné, parce que vous ne pouvez pas opérer sur place. Les Pandas peuvent faire les deux.Une autre option est d'utiliser
numpy.plein
, une option disponible dans NumPy 1.8+C'est assez flexible et vous pouvez le remplir avec n'importe quel autre nombre que vous voulez.
full
est destiné.np.empy((x,y))*np.nan
est un bon coureur (et leur compatibilité avec 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 solutions de rechange proposées pour la vitesse et a constaté que, pour assez grand vecteurs/matrices à remplir, toutes les solutions de rechange à l'exception
val * ones
etarray(n * [val])
sont tout aussi rapides.Code de reproduire la parcelle:
numpy.full(n, val)
est plus lent quea = numpy.empty(n) .. a.fill(val)
depuis il fait la même chose en interneÊtes-vous familier avec
numpy.nan
?Vous pouvez créer votre propre méthode telle que:
Puis
serait sortie de
J'ai trouvé ce code dans un liste de diffusion thread.
Vous pouvez toujours utiliser la multiplication si vous n'avez pas immédiatement rappeler le
.empty
ou.full
méthodes:Bien sûr, il fonctionne avec n'importe quelle autre valeur numérique ainsi:
Mais l' @u0b34a0f6ae de accepté de répondre à est 3x plus rapide (nombre de cycles CPU, pas de cerveau cycles de rappeler numpy syntaxe ;):
Comme l'a dit, numpy.empty() est le chemin à parcourir. Toutefois, pour les objets, de remplissage() peut ne pas faire exactement ce que vous pensez que cela fonctionne:
Un moyen de contourner peuvent être par exemple:
Une autre alternative est
numpy.broadcast_to(val,n)
qui renvoie en temps constant quelle que soit la taille et est aussi le plus efficace en terme de mémoire (elle renvoie une vue de la répétition de l'élément). Le problème, c'est que la valeur retournée est en lecture seule.Ci-dessous une comparaison des performances de toutes les autres méthodes qui ont été proposées à l'aide de la même référence que dans Nico Schlömer réponse.
Encore une autre possibilité est pas encore mentionné ici est d'utiliser NumPy tuile:
Donne également
Je ne sais pas sur la comparaison de la vitesse.