Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Mengindeks Tatasusunan N-Dimensi dengan Cekap dengan Tatasusunan Indeks Dimensi Rendah?

Bagaimana untuk Mengindeks Tatasusunan N-Dimensi dengan Cekap dengan Tatasusunan Indeks Dimensi Rendah?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-10-21 13:09:021026semak imbas

How to Efficiently Index N-Dimensional Arrays with Lower-Dimensional Index Arrays?

Mengindeks Tatasusunan N-Dimensi dengan Tatasusunan (N-1)-Dimensi

Mengakses tatasusunan N-dimensi dengan (N Tatasusunan -1)-dimensi memberikan cabaran apabila mencari nilai yang diselaraskan sepanjang dimensi tertentu. Pendekatan konvensional menggunakan np.argmax mungkin tidak mencukupi.

Pendekatan Pengindeksan Lanjutan

Pengindeksan yang elegan boleh dicapai melalui pengindeksan lanjutan menggunakan np.ogrid. Untuk tatasusunan 3D a dan argmaxnya di sepanjang dimensi pertama, 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]

Pendekatan ini mencipta grid yang meluaskan tatasusunan indeks dengan berkesan kepada dimensi penuh tatasusunan asal.

Generalisasi untuk Dimensi Arbitrari

Untuk penyelesaian yang lebih umum, fungsi argmax_to_max() boleh ditakrifkan:

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

Fungsi ini mengambil tatasusunan asal, argmaxnya, dan paksi yang dikehendaki dan mengembalikan nilai maksimum yang sepadan.

Pendekatan Alternatif untuk Pengindeksan Umum

Untuk mengindeks sebarang tatasusunan N-dimensi dengan (N-1)-dimensi tatasusunan, fungsi all_idx() ialah penyelesaian yang lebih mudah:

def all_idx(idx, axis):
    grid = np.ogrid[tuple(map(slice, idx.shape))]
    grid.insert(axis, idx)
    return tuple(grid)

Menggunakan fungsi ini, pengindeksan ke dalam tatasusunan a dengan idx sepanjang paksi paksi boleh dicapai dengan:

axis = 0
a_max_values = a[all_idx(idx, axis=axis)]

Atas ialah kandungan terperinci Bagaimana untuk Mengindeks Tatasusunan N-Dimensi dengan Cekap dengan Tatasusunan Indeks Dimensi Rendah?. 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