Indizieren eines N-dimensionalen Arrays mit einem (N-1)-dimensionalen Array
Zugriff auf ein N-dimensionales Array mit einem (N -1)-dimensionale Arrays stellen eine Herausforderung dar, wenn nach Werten gesucht wird, die entlang einer bestimmten Dimension ausgerichtet sind. Herkömmliche Ansätze mit np.argmax reichen möglicherweise nicht aus.
Erweiterter Indexierungsansatz
Eine elegante Indizierung kann durch erweiterte Indizierung mit np.ogrid erreicht werden. Für ein 3D-Array a und seinen Argmax entlang der ersten Dimension gilt 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]
Dieser Ansatz erstellt ein Raster, das das Index-Array effektiv auf die vollen Dimensionen des ursprünglichen Arrays erweitert.
Verallgemeinerung für beliebige Dimensionen
Für eine allgemeinere Lösung kann die Funktion argmax_to_max() definiert werden:
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)]
Diese Funktion verwendet das ursprüngliche Array, seinen argmax, und der gewünschten Achse und gibt die entsprechenden Maximalwerte zurück.
Alternativer Ansatz für die allgemeine Indizierung
Zur Indizierung eines beliebigen N-dimensionalen Arrays mit einer (N-1)-Dimension Array ist die Funktion all_idx() eine vereinfachte Lösung:
def all_idx(idx, axis): grid = np.ogrid[tuple(map(slice, idx.shape))] grid.insert(axis, idx) return tuple(grid)
Mit dieser Funktion kann die Indizierung im Array a mit idx entlang der Achsenachse erfolgen mit:
axis = 0 a_max_values = a[all_idx(idx, axis=axis)]
Das obige ist der detaillierte Inhalt vonWie können N-dimensionale Arrays effizient mit Arrays mit niedrigerem Index indexiert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!