Heim  >  Artikel  >  Backend-Entwicklung  >  Wie können N-dimensionale Arrays effizient mit Arrays mit niedrigerem Index indexiert werden?

Wie können N-dimensionale Arrays effizient mit Arrays mit niedrigerem Index indexiert werden?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-21 13:09:02920Durchsuche

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

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn