Maison >développement back-end >Tutoriel Python >Comment trouver des indices de lignes de valeurs multiples dans un tableau NumPy ?

Comment trouver des indices de lignes de valeurs multiples dans un tableau NumPy ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-07 06:16:13188parcourir

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

Trouver les index de lignes de plusieurs valeurs dans un tableau Numpy

Problème :

Nous reçoivent un tableau NumPy X et un ensemble de valeurs searched_values. L'objectif est de déterminer les indices de ligne dans X qui correspondent à chacune des valeurs dans searched_values.

Par exemple, pour les tableaux d'entrée suivants :

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 doit être :

[0, 3, 4]

Approche n°1 : diffusion NumPy

Ceci L'approche utilise la diffusion NumPy pour effectuer des comparaisons par éléments entre X et chaque ligne de valeurs recherchées :

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

Approche n°2 : conversion efficace en mémoire à l'aide de np.in1d

Pour économiser la mémoire, nous pouvons convertir chaque ligne de X et searched_values ​​en équivalents d'index linéaire, puis appliquer np.in1d ​​pour intersection :

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 n° 3 : Conversion efficace en mémoire à l'aide de np.searchsorted

Une autre approche efficace en mémoire utilisant np.searchsorted et la même philosophie d'index linéaire conversion :

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)]

Compréhension np.ravel_multi_index

np.ravel_multi_index convertit chaque ligne de X en un équivalent d'index linéaire unique. Il fonctionne sur un tableau 2D d'indices à n dimensions et sur la forme de la grille à n dimensions sur laquelle ces indices doivent être mappés.

Par exemple, dans notre exemple, chaque ligne de X représente un tuple d'indexation pour une grille 2D avec des dimensions atténuées. np.ravel_multi_index mappe chacun de ces tuples à un index linéaire unique.

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