Maison >développement back-end >Tutoriel Python >Comment accéder efficacement aux valeurs dans des tableaux multidimensionnels à l'aide de tableaux de dimension inférieure ?
Accès à des tableaux multidimensionnels avec des tableaux de dimension inférieure
Dans des tableaux multidimensionnels, la récupération de valeurs selon une dimension spécifique à l'aide d'un tableau de dimensionnalité inférieure peut être stimulant. Prenons l'exemple ci-dessous :
<code class="python">a = np.random.random_sample((3,4,4)) b = np.random.random_sample((3,4,4)) idx = np.argmax(a, axis=0)</code>
Comment pouvons-nous accéder aux maxima dans un idx utilisant comme si nous avions utilisé a.max(axis=0) ? Comment pouvons-nous récupérer les valeurs correspondantes de b ?
Solution élégante utilisant l'indexation avancée
L'indexation avancée offre un moyen flexible d'y parvenir :
<code class="python">m, n = a.shape[1:] # Extract dimensions excluding axis 0 I, J = np.ogrid[:m, :n] a_max_values = a[idx, I, J] # Index using the grid b_max_values = b[idx, I, J]</code>
Cette solution exploite le fait que la grille [idx, I, J] couvre toutes les combinaisons possibles d'indices pour les dimensions restantes.
Généralisation pour la dimensionnalité arbitraire
Pour un tableau général à n dimensions, une fonction peut être définie pour généraliser la solution ci-dessus :
<code class="python">def argmax_to_max(arr, argmax, axis): """ Apply argmax() operation along one axis to retrieve maxima. Args: arr: Array to apply argmax to argmax: Resulting argmax array axis: Axis to apply argmax (0-based) Returns: Maximum values along specified axis """ new_shape = list(arr.shape) del new_shape[axis] grid = np.ogrid[tuple(map(slice, new_shape))] # Create grid of indices grid.insert(axis, argmax) return arr[tuple(grid)]</code>
Méthode d'indexation alternative
Alternativement, une fonction peut être créée pour générer une grille d'indices pour tous les axes :
<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 grille peut ensuite être utilisée pour accéder à un tableau multidimensionnel avec un tableau de dimension inférieure :
<code class="python">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!