Comment indexer efficacement des tableaux à N dimensions avec des tableaux d'index de dimension inférieure ?

Mary-Kate Olsen
Libérer: 2024-10-21 13:09:02
original
923 Les gens l'ont consulté

How to Efficiently Index N-Dimensional Arrays with Lower-Dimensional Index Arrays?

Indexation d'un tableau à N dimensions avec un tableau à (N-1) dimensions

Accès à un tableau à N dimensions avec un (N -1)-Le tableau dimensionnel présente un défi lors de la recherche de valeurs alignées sur une dimension spécifique. Les approches conventionnelles utilisant np.argmax peuvent ne pas suffire.

Approche d'indexation avancée

Une indexation élégante peut être obtenue grâce à une indexation avancée à l'aide de np.ogrid. Pour un tableau 3D a et son argmax le long de la première dimension, idx :

import numpy as np

a = np.random.random_sample((3, 4, 4))
idx = np.argmax(a, axis=0)

m, n = a.shape[1:]
I, J = np.ogrid[:m, :n]
a_max_values = a[idx, I, J]
Copier après la connexion

Cette approche crée une grille qui étend efficacement le tableau d'index aux dimensions complètes du tableau d'origine.

Généralisation pour les dimensions arbitraires

Pour une solution plus généralisée, la fonction argmax_to_max() peut être définie :

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)]
Copier après la connexion

Cette fonction prend le tableau d'origine, son argmax, et l'axe souhaité et renvoie les valeurs maximales correspondantes.

Approche alternative pour l'indexation générale

Pour indexer tout tableau à N dimensions avec une dimension (N-1) tableau, la fonction all_idx() est une solution plus simplifiée :

def all_idx(idx, axis):
    grid = np.ogrid[tuple(map(slice, idx.shape))]
    grid.insert(axis, idx)
    return tuple(grid)
Copier après la connexion

En utilisant cette fonction, l'indexation dans le tableau a avec idx le long de l'axe peut être réalisée avec :

axis = 0
a_max_values = a[all_idx(idx, axis=axis)]
Copier après la connexion

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!

source:php
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!