Maison >développement back-end >Tutoriel Python >Comment accéder efficacement à un tableau à N dimensions avec un tableau à dimensions (N-1) ?

Comment accéder efficacement à un tableau à N dimensions avec un tableau à dimensions (N-1) ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-21 11:57:03239parcourir

How to Access N-Dimensional Array with (N-1)-Dimensional Array Efficiently?

Accéder à un tableau à N dimensions avec un tableau à (N-1) dimensions

Étant donné un tableau à N dimensions a et un (N- Tableau 1)-dimensionnel idx, une tâche courante consiste à accéder aux éléments dans un spécifié par les indices dans idx. Cela peut être utile pour effectuer des opérations telles que trouver des maxima ou récupérer des valeurs spécifiques.

Solution élégante utilisant l'indexation avancée

Une solution élégante implique l'utilisation de l'indexation avancée avec la fonction ogrid de NumPy. :

<code class="python">m, n = a.shape[1:]
I, J = np.ogrid[:m, :n]
a_max_values = a[idx, I, J]
b_max_values = b[idx, I, J]</code>

Cela crée une grille de maillage d'indices et l'utilise pour indexer dans a et b, ce qui donne des tableaux contenant les valeurs correspondantes.

Cas général avec fonction

Pour une solution plus générale qui fonctionne pour n'importe quel axe spécifié, nous pouvons définir une fonction :

<code class="python">def argmax_to_max(arr, argmax, axis):
    new_shape = list(arr.shape)
    del new_shape[axis]

    grid = np.ogrid[tuple(map(slice, new_shape))]
    grid.insert(axis, argmax)

    return arr[tuple(grid)]</code>

Cette fonction prend un tableau, son argmax le long d'un axe spécifié et l'axe lui-même . Il construit ensuite une grille de maillage et l'utilise pour extraire les éléments correspondants.

Indexation simplifiée avec fonction personnalisée

Pour simplifier davantage le processus d'indexation, nous pouvons créer une fonction d'assistance qui génère une grille d'indices :

<code class="python">def all_idx(idx, axis):
    grid = np.ogrid[tuple(map(slice, idx.shape))]
    grid.insert(axis, idx)
    return tuple(grid)</code>

Cette fonction renvoie un tuple d'indices qui peut être utilisé directement pour indexer dans des tableaux d'entrée :

<code class="python">axis = 0
a_max_values = a[all_idx(idx, axis=axis)]
b_max_values = b[all_idx(idx, axis=axis)]</code>

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