Heim > Backend-Entwicklung > Python-Tutorial > 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
Freigeben: 2024-10-21 13:09:02
Original
1062 Leute haben es durchsucht

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]
Nach dem Login kopieren

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)]
Nach dem Login kopieren

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)
Nach dem Login kopieren

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)]
Nach dem Login kopieren

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!

Quelle:php
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage