Heim >Backend-Entwicklung >Python-Tutorial >Wie kann man mithilfe niederdimensionaler Arrays effektiv auf Werte in mehrdimensionalen Arrays zugreifen?
Zugriff auf mehrdimensionale Arrays mit Arrays niedrigerer Dimensionen
In mehrdimensionalen Arrays kann das Abrufen von Werten entlang einer bestimmten Dimension mithilfe eines Arrays niedrigerer Dimensionalität möglich sein herausfordernd. Betrachten Sie das folgende Beispiel:
<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>
Wie können wir mit idx auf die Maxima in a zugreifen, als hätten wir a.max(axis=0) verwendet? Wie rufen wir die entsprechenden Werte aus b ab?
Elegante Lösung mit erweiterter Indizierung
Erweiterte Indizierung bietet eine flexible Möglichkeit, dies zu erreichen:
<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>
Diese Lösung nutzt die Tatsache aus, dass das Gitter [idx, I, J] alle möglichen Kombinationen von Indizes für die verbleibenden Dimensionen abdeckt.
Verallgemeinerung für beliebige Dimensionalität
Für ein allgemeines n-dimensionales Array kann eine Funktion definiert werden, um die obige Lösung zu verallgemeinern:
<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>
Alternative Indexierungsmethode
Alternativ kann eine Funktion erstellt werden um ein Raster von Indizes für alle Achsen zu generieren:
<code class="python">def all_idx(idx, axis): grid = np.ogrid[tuple(map(slice, idx.shape))] grid.insert(axis, idx) return tuple(grid)</code>
Dieses Raster kann dann verwendet werden, um auf ein mehrdimensionales Array mit einem niedrigerdimensionalen Array zuzugreifen:
<code class="python">a_max_values = a[all_idx(idx, axis=axis)] b_max_values = b[all_idx(idx, axis=axis)]</code>
Das obige ist der detaillierte Inhalt vonWie kann man mithilfe niederdimensionaler Arrays effektiv auf Werte in mehrdimensionalen Arrays zugreifen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!