Maison >développement back-end >Tutoriel Python >Comment trouver efficacement des indices de ligne de valeurs spécifiques dans un tableau NumPy ?

Comment trouver efficacement des indices de ligne de valeurs spécifiques dans un tableau NumPy ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-07 17:22:13725parcourir

How to Efficiently Find Row Indices of Specific Values in a NumPy Array?

Trouver l'index de valeurs spécifiques dans un tableau NumPy

Problème :

Étant donné un tableau X, déterminez les indices de ligne des valeurs spécifiées stockées dans searched_values. Par exemple, dans l'exemple suivant, nous recherchons les indices pour le. valeurs [4, 2], [3, 3] et [5, 6] dans le tableau X.

X = np.array([[4,  2],
              [9,  3],
              [8,  5],
              [3,  3],
              [5,  6]])

searched_values = np.array([[4, 2],
                            [3, 3],
                            [5, 6]])

La sortie souhaitée serait :

[0, 3, 4]

Solutions :

Approche 1 : NumPy La diffusion

est un moyen d'utiliser np.where et les fonctions de diffusion sont les suivantes.

np.where((X == searched_values[:, None]).all(-1))[1]

Approche 2 : Conversion d'index linéaire efficace en mémoire

Comment convertir chaque ligne en un index linéaire unique à l'aide de np.ravel_multi_index de NumPy Il existe.

dims = X.max(0) + 1
out = np.where(np.in1d(np.ravel_multi_index(X.T, dims),
                       np.ravel_multi_index(searched_values.T, dims)))[0]

Approche 3 : Conversion d'index linéaire optimisée et efficace en mémoire

Le np.searchsorted de NumPy peut également être utilisé pour trouver rapidement des index linéaires.

dims = X.max(0) + 1
X1D = np.ravel_multi_index(X.T, dims)
searched_valuesID = np.ravel_multi_index(searched_values.T, dims)
sidx = X1D.argsort()
out = sidx[np.searchsorted(X1D, searched_valuesID, sorter=sidx)]

Comment fonctionne np.ravel_multi_index :

np.ravel_multi_index crée une représentation d'index linéaire d'un index multidimensionnel. Interprétez chaque ligne comme un index dans un tableau multidimensionnel à n dimensions et générez l'index linéaire correspondant.

Par exemple, appliquer np.ravel_multi_index(X.T, dims) à un exemple de tableau X :

np.ravel_multi_index(X.T, dims)
# Output: array([30, 66, 61, 24, 41])

Cela représente l'index linéaire de chaque ligne du tableau X. Cet index linéaire peut être utilisé pour identifier de manière unique chaque ligne du tableau.

L'exemple de code correspondant à chaque méthode est ci-dessous.

# Approach 1
print(np.where((X == searched_values[:, None]).all(-1))[1])

# Approach 2
dims = X.max(0) + 1
print(np.where(np.in1d(np.ravel_multi_index(X.T, dims),
                       np.ravel_multi_index(searched_values.T, dims)))[0])

# Approach 3
dims = X.max(0) + 1
X1D = np.ravel_multi_index(X.T, dims)
searched_valuesID = np.ravel_multi_index(searched_values.T, dims)
sidx = X1D.argsort()
print(sidx[np.searchsorted(X1D, searched_valuesID, sorter=sidx)])

Vous pouvez facilement déterminer l'index de ligne d'une valeur particulière dans le tableau X en utilisant l'une ou l'autre approche.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn