Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Mengakses Nilai dalam Tatasusunan Berbilang Dimensi Menggunakan Tatasusunan Dimensi Rendah dengan Berkesan?

Bagaimana untuk Mengakses Nilai dalam Tatasusunan Berbilang Dimensi Menggunakan Tatasusunan Dimensi Rendah dengan Berkesan?

Barbara Streisand
Barbara Streisandasal
2024-10-21 13:34:02291semak imbas

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

Mengakses Tatasusunan Berbilang Dimensi dengan Tatasusunan Dimensi Rendah

Dalam tatasusunan berbilang dimensi, mendapatkan semula nilai sepanjang dimensi tertentu menggunakan tatasusunan dimensi yang lebih rendah boleh mencabar. Pertimbangkan contoh di bawah:

<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>

Bagaimanakah kita boleh mengakses maxima dalam menggunakan idx seolah-olah kita telah menggunakan a.max(axis=0)? Bagaimanakah kita boleh mendapatkan semula nilai yang sepadan daripada b?

Penyelesaian Elegan Menggunakan Pengindeksan Lanjutan

Pengindeksan lanjutan menyediakan cara yang fleksibel untuk mencapai perkara ini:

<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>

Penyelesaian ini mengeksploitasi fakta bahawa grid [idx, I, J] merangkumi semua kemungkinan kombinasi indeks untuk dimensi yang selebihnya.

Generalisasi untuk Dimensi Arbitrari

Untuk tatasusunan n-dimensi am, fungsi boleh ditakrifkan untuk menggeneralisasikan penyelesaian di atas:

<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>

Kaedah Pengindeksan Alternatif

Sebagai alternatif, fungsi boleh dibuat untuk menjana grid indeks untuk semua paksi:

<code class="python">def all_idx(idx, axis):
    grid = np.ogrid[tuple(map(slice, idx.shape))]
    grid.insert(axis, idx)
    return tuple(grid)</code>

Grid ini kemudiannya boleh digunakan untuk mengakses tatasusunan berbilang dimensi dengan tatasusunan berdimensi rendah:

<code class="python">a_max_values = a[all_idx(idx, axis=axis)]
b_max_values = b[all_idx(idx, axis=axis)]</code>

Atas ialah kandungan terperinci Bagaimana untuk Mengakses Nilai dalam Tatasusunan Berbilang Dimensi Menggunakan Tatasusunan Dimensi Rendah dengan Berkesan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn