Maison >développement back-end >Tutoriel Python >Comment trouver efficacement des indices de ligne 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!