94 votes

Quel est le moyen le plus efficace de vérifier si une valeur existe dans un tableau NumPy ?

J'ai un très grand tableau NumPy

 1 40 3
4 50 4
5 60 7
5 49 6
6 70 8
8 80 9
8 72 1
9 90 7
.... 

Je veux vérifier si une valeur existe dans la 1ère colonne du tableau. J'ai un tas de méthodes maison (par exemple, parcourir chaque ligne et vérifier), mais étant donné la taille du tableau, j'aimerais trouver la méthode la plus efficace.

Merci!

109voto

agf Points 45052

Que diriez-vous

 if value in my_array[:, col_num]:
    do_whatever

Edit : je pense que __contains__ est implémenté de telle sorte que c'est la même chose que la version de @detly

61voto

detly Points 11267

Le plus évident pour moi serait :

 np.any(my_array[:, 0] == value)

49voto

HYRY Points 26340

Pour vérifier plusieurs valeurs, vous pouvez utiliser numpy.in1d(), qui est une version de fonction par élément du mot-clé python in. Si vos données sont triées, vous pouvez utiliser numpy.searchsorted() :

 import numpy as np
data = np.array([1,4,5,5,6,8,8,9])
values = [2,3,4,6,7]
print np.in1d(values, data)

index = np.searchsorted(data, values)
print data[index] == values

3voto

Joelmob Points 563

L'ajout à la réponse de @HYRY in1d semble être le plus rapide pour numpy. Cela utilise numpy 1.8 et python 2.7.6.

Dans ce test, in1d a été le plus rapide, mais 10 in a air plus propre :

 a = arange(0,99999,3)
%timeit 10 in a
%timeit in1d(a, 10)

10000 loops, best of 3: 150 µs per loop
10000 loops, best of 3: 61.9 µs per loop

Construire un ensemble est plus lent que d'appeler in1d, mais vérifier si la valeur existe est un peu plus rapide :

 s = set(range(0, 99999, 3))
%timeit 10 in s

10000000 loops, best of 3: 47 ns per loop

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X