Enregistrement rapide pour NaN dans NumPy
Je suis à la recherche de la façon la plus rapide pour vérifier l'apparition de NaN (np.nan
) dans un tableau NumPy X
. np.isnan(X)
est hors de question, car elle construit un booléen tableau de forme X.shape
, qui est potentiellement gigantesque.
J'ai essayé np.nan in X
, mais qui ne semble pas fonctionner, car np.nan != np.nan
. Est-il rapide et efficace de la mémoire manière de faire tout cela?
(Pour ceux qui se demandent "comment gigantesque": je ne peux pas dire. C'est la validation d'entrée pour le code de bibliothèque.)
- ne la validation de la saisie de l'utilisateur ne fonctionnent pas dans ce scénario? Comme dans vérifier NaN avant de l'insérer
- non, la bibliothèque prend des tableaux NumPy ou
scipy.sparse
de matrices d'entrée. - Si vous êtes en train de faire beaucoup, j'ai entendu de bonnes choses au sujet de Goulot d'étranglement (pypi.python.org/pypi/Bottleneck)
Vous devez vous connecter pour publier un commentaire.
Ray solution est bonne. Cependant, sur ma machine, il est d'environ 2,5 x plus rapide à utiliser
numpy.somme
en place denumpy.min
:Contrairement à
min
,sum
ne nécessite pas de branchement, qui sur le matériel moderne a tendance à être assez cher. C'est probablement la raison pour laquellesum
est plus rapide.modifier Le test ci-dessus a été réalisée avec un seul NaN droit dans le milieu du tableau.
Il est intéressant de noter que
min
est plus lente en présence de NaNs qu'en leur absence. Il semble également obtenir plus lent que NaNs obtenir plus près du début du tableau. D'autre part,sum
's le débit semble constant, indépendamment de savoir si il y a des NaNs et où ils sont situés:np.min
est plus rapide lorsque le tableau contient pas de NaNs, qui est ma contribution qui est attendue. Mais j'ai décidé d'accepter celle-ci de toute façon, parce qu'il attrapeinf
etneginf
ainsi.inf
ou-inf
si l'entrée contient à la fois, et il a des problèmes si l'entrée contient un grand mais fini valeurs de dépassement lorsqu'on les additionne.np.sum
est encore d'environ 30% plus rapide quenp.min
.np.isnan(x).any(0)
est légèrement plus rapide quenp.sum
etnp.min
sur ma machine, même s'il pourrait être non désirés de la mise en cache.sum()
est plus rapide: stackoverflow.com/q/22392185/974555Je pense que
np.isnan(np.min(X))
devrait faire ce que vous voulez.Même, il existe un acceptées réponse, je vais, comme pour démontrer que la suite (avec Python 2.7.2 et Numpy 1.6.0 sur Vista):
Ainsi, la façon vraiment efficace pourrait être fortement dépendant du système d'exploitation. De toute façon
dot(.)
base semble être la plus stable.x
contient de grandes valeurs, et je tiens également à vérifier inf.isfinite(.)
. Je voulais juste souligner l'énorme écart de performance. Mercimin
- ousum
basée sur les approches, qui se limite à un seul noyau. Ergo, que l'écart de performances.Il existe deux approches générales ici:
nan
et prendreany
.nan
s (commesum
) et vérifier son état.Alors que la première approche est certainement le plus propre, le lourd optimisation de certains de l'ensemble des opérations (en particulier ceux qui sont exécutés dans les BLAS, comme
dot
) permet de le faire assez rapidement. Notez quedot
, à l'instar de certains autres BLAS, sont multithread sous certaines conditions. C'est ce qui explique la différence de vitesse entre les différentes machines.Si vous êtes à l'aise avec numba il permet de créer un rapide court-circuit (s'arrête dès qu'on trouve un NaN) fonction:
Si il n'y a pas de
NaN
la fonction pourrait en fait être plus lent quenp.min
, je pense que c'est parce quenp.min
utilise le multitraitement pour de grands tableaux:Mais dans le cas où il y a un NaN dans le tableau, surtout si c'est la position à de faibles indices, alors c'est beaucoup plus rapide:
Des résultats similaires peuvent être obtenus avec Cython ou un C extension, ce sont un peu plus compliqué (ou facilement disponibles comme
goulot d'étranglement.anynan
) mais ultimatly faire la même chose que monanynan
fonction.utilisation .tout()
if numpy.isnan(myarray).any()
numpy.isfinite peut-être mieux que isnan pour la vérification de
if not np.isfinite(prop).all()
Est lié à ce que la question de la façon de trouver la première occurrence de NaN. C'est le moyen le plus rapide pour gérer ce que je connais: