Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann man mithilfe niederdimensionaler Arrays effektiv auf Werte in mehrdimensionalen Arrays zugreifen?

Wie kann man mithilfe niederdimensionaler Arrays effektiv auf Werte in mehrdimensionalen Arrays zugreifen?

Barbara Streisand
Barbara StreisandOriginal
2024-10-21 13:34:02286Durchsuche

How to Access Values in Multidimensional Arrays Using Lower- Dimensional Arrays Effectively?

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!

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