113 votes

Numpy : trouver l'index des éléments dans la plage.

J'ai un tableau numpy de nombres, par exemple,

a = np.array([1, 3, 5, 6, 9, 10, 14, 15, 56])  

Je voudrais trouver tous les indices des éléments dans une plage spécifique. Par exemple, si l'intervalle est (6, 10), la réponse devrait être (3, 4, 5). Existe-t-il une fonction intégrée permettant de faire cela ?

5voto

Nathan Points 1433

Cet extrait de code renvoie tous les nombres dans un tableau numpy entre deux valeurs :

a = np.array([1, 3, 5, 6, 9, 10, 14, 15, 56] )
a[(a>6)*(a<10)]

Il fonctionne comme suit : (a>6) renvoie un tableau numpy avec True (1) et False (0), tout comme (a<10). En multipliant les deux ensemble, vous obtenez un tableau avec soit un True, si les deux déclarations sont True (parce que 1x1 = 1) ou False (parce que 0x0 = 0 et 1x0 = 0).

La partie a[...] renvoie toutes les valeurs du tableau a où le tableau entre parenthèses renvoie une instruction True.

Bien sûr, vous pouvez rendre cela plus compliqué en disant par exemple

...*(1-a<10) 

qui est similaire à une déclaration "et non".

5voto

Jorge Crvz Points 69

L'autre moyen est avec :

np.vectorize(lambda x: 6 <= x <= 10)(a)

qui revient :

array([False, False, False,  True,  True,  True, False, False, False])

Elle est parfois utile pour masquer des séries temporelles, des vecteurs, etc.

3voto

Abhishek Points 932
a = np.array([1, 3, 5, 6, 9, 10, 14, 15, 56])
np.argwhere((a>=6) & (a<=10))

3voto

biosckon Points 59

Je voulais ajouter numexpr dans le mélange :

import numpy as np
import numexpr as ne

a = np.array([1, 3, 5, 6, 9, 10, 14, 15, 56])  

np.where(ne.evaluate("(6 <= a) & (a <= 10)"))[0]
# array([3, 4, 5], dtype=int64)

Cela n'aurait de sens que pour des tableaux plus grands avec des millions... ou si vous vous heurtez à des limites de mémoire.

1voto

cvanelteren Points 1285

Ce n'est peut-être pas le plus joli, mais il convient à toutes les dimensions.

a = np.array([[-1,2], [1,5], [6,7], [5,2], [3,4], [0, 0], [-1,-1]])
ranges = (0,4), (0,4) 

def conditionRange(X : np.ndarray, ranges : list) -> np.ndarray:
    idx = set()
    for column, r in enumerate(ranges):
        tmp = np.where(np.logical_and(X[:, column] >= r[0], X[:, column] <= r[1]))[0]
        if idx:
            idx = idx & set(tmp)
        else:
            idx = set(tmp)
    idx = np.array(list(idx))
    return X[idx, :]

b = conditionRange(a, ranges)
print(b)

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