Maison > Article > développement back-end > Comment extraire des éléments d'un tableau NumPy 2D à l'aide des indices d'un autre tableau ?
Extraire des éléments d'un tableau 2D à l'aide d'indices d'un autre tableau
Dans NumPy, il devient parfois nécessaire d'extraire des éléments spécifiques d'un tableau multidimensionnel basé sur des indices stockés dans un autre tableau. Ce scénario se produit souvent lorsque vous travaillez avec des structures de données telles que des matrices clairsemées ou des sélections indexées.
Problème :
Considérez deux tableaux NumPy :
A = np.array([[0, 1], [2, 3], [4, 5]]) B = np.array([[1], [0], [1]]) # Index array
Le but est d'extraire un élément de chaque ligne de A, où l'élément spécifique est spécifié par l'index dans la ligne correspondante de B. Le résultat attendu devrait être :
C = np.array([[1], [2], [5]])
Solutions :
1. Indexation de tableaux purement entiers :
A[np.arange(A.shape[0]), B.ravel()]
Cette méthode implique l'utilisation des capacités d'indexation de tableaux d'entiers de NumPy. Il génère une plage d'indices correspondant aux lignes de A et la combine avec le tableau B aplati pour sélectionner les éléments appropriés.
2. Transposition et np.choose :
np.choose(B.ravel(), A.T)
Dans cette approche alternative, vous transposez A pour qu'il corresponde à la forme de B, puis utilisez np.choose pour sélectionner les éléments souhaités en fonction du tableau B aplati.
3. Déballage itérable (Python >=3.6) :
*A = A.T C = np.array([*zip(*A)][i] for i in B.ravel())
Cette méthode utilise le déballage itérable pour convertir A en une liste de lignes, puis parcourt les lignes de A en fonction des indices de B pour extraire les éléments souhaités.
4. Compréhensions de liste et diffusion :
[A[i][j] for i, j in zip(range(A.shape[0]), B.ravel())]
Les compréhensions de liste peuvent être utilisées pour créer un nouveau tableau en itérant sur les éléments de A et B et en effectuant la sélection par élément.
5. Indexation sophistiquée (NumPy >=1.18) :
A[np.stack([range(A.shape[0]), B.ravel()], axis=1)]
L'indexation sophistiquée permet des opérations d'indexation plus efficaces et plus compactes. Dans ce cas, il crée un tableau 2D avec les indices de ligne et les indices B, qui peuvent être utilisés pour sélectionner les éléments souhaités dans A.
La solution la plus appropriée dépend des exigences et contraintes spécifiques de la tâche, tels que l'efficacité, la lisibilité et la compatibilité avec les anciennes versions de NumPy.
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!