58 votes

Fonction MATLAB find () en Python

Dans MATLAB, il est très facile de trouver le indecies de valeurs qui répondent à des conditions particulières:

>> a = [1,2,3,1,2,3,1,2,3];
>> find(a > 2)     % find the indecies where this condition is true
[3, 6, 9]          % (MATLAB uses 1-based indexing)
>> a(find(a > 2))  % get the values at those locations
[3, 3, 3]

Ma question est de savoir quelle serait la meilleure façon de le faire en Python. Jusqu'à présent, je suis venu avec la suivante. Juste obtenir les valeurs:

>>> a = [1,2,3,1,2,3,1,2,3]
>>> [val for val in a if val > 2]
[3, 3, 3]

Mais si je veux l'index de chacune de ces valeurs, il est un peu plus compliqué:

>>> a = [1,2,3,1,2,3,1,2,3]
>>> inds = [i for (i, val) in enumerate(a) if val > 2]
>>> inds
[2, 5, 8]
>>> [val for (i, val) in enumerate(a) if i in inds]
[3, 3, 3]

Est-il une meilleure façon de le faire en Python en particulier pour arbitraire conditions (pas juste "val > 2')? J'ai trouvé des fonctions équivalentes à MATLAB "trouver" dans NumPy mais je n'ont pas actuellement accès à ces bibliothèques.

84voto

joaquin Points 22450

numpy vous avez where :

 >> import numpy as np
>> x = np.random.randint(0, 20, 10)
>> x
array([14, 13,  1, 15,  8,  0, 17, 11, 19, 13])
>> np.where(x > 10)
(array([0, 1, 3, 6, 7, 8, 9], dtype=int64),)
 

27voto

John Points 796

Vous pouvez créer une fonction prenant un paramètre appelable qui sera utilisé dans la partie condition de la compréhension de votre liste. Ensuite, vous pouvez utiliser un objet fonction lambda ou autre pour passer votre condition arbitraire:

 def indices(a, func):
    return [i for (i, val) in enumerate(a) if func(val)]

a = [1, 2, 3, 1, 2, 3, 1, 2, 3]

inds = indices(a, lambda x: x > 2)

>>> inds
[2, 5, 8]
 

C'est un peu plus proche de votre exemple Matlab, sans avoir à charger tout numpy.

8voto

vincentv Points 60

Ou utilisez la fonction non nulle de numpy:

 import numpy as np
a    = np.array([1,2,3,4,5])
inds = np.nonzero(a>2)
a[inds] 
array([3, 4, 5])
 

5voto

JasonFruit Points 3709

Pourquoi ne pas simplement utiliser ceci:

 [i for i in range(len(a)) if a[i] > 2]
 

ou pour des conditions arbitraires, définissez une fonction f pour votre condition et faites:

 [i for i in range(len(a)) if f(a[i])]
 

3voto

Blair Points 6090

Pour obtenir des valeurs avec des conditions arbitraires, vous pouvez utiliser filter() avec une fonction lambda:

 >>> a = [1,2,3,1,2,3,1,2,3]
>>> filter(lambda x: x > 2, a)
[3, 3, 3]
 

Une façon possible d'obtenir les indices serait d'utiliser enumerate() pour construire un tuple avec des indices et des valeurs, puis de filtrer les éléments suivants:

 >>> a = [1,2,3,1,2,3,1,2,3]
>>> aind = tuple(enumerate(a))
>>> print aind
((0, 1), (1, 2), (2, 3), (3, 1), (4, 2), (5, 3), (6, 1), (7, 2), (8, 3))
>>> filter(lambda x: x[1] > 2, aind)
((2, 3), (5, 3), (8, 3))
 

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