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

Barbara Streisand
Lepaskan: 2024-10-21 13:34:02
asal
296 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!