首頁  >  文章  >  後端開發  >  如何使用低維索引數組高效索引 N 維數組?

如何使用低維索引數組高效索引 N 維數組?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-10-21 13:09:02910瀏覽

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

使用(N-1) 維數組索引N 維數組

使用(N) 存取N 維數組-1) 維數組在尋找沿著特定維度對齊的值時提出了挑戰。使用 np.argmax 的傳統方法可能不夠。

高級索引方法

可以透過使用 np.ogrid 的高級索引來實現優雅的索引。對於 3D 數組 a 及其沿著第一維的 argmax,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]

此方法建立一個網格,可有效地將索引數組擴展到原始數組的完整維度。

任意維度的泛化

對於更泛化的解,可以定義argmax_to_max() 函數:

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

函數採用原始數組及其argmax,和所需的軸並傳回對應的最大值。

通用索引的替代方法

用於使用(N-1) 維索引任何N 維數組數組, all_idx() 函數是一個更簡化的解決方案:

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

使用此函數,可以使用idx 沿axis 索引數組a 來完成:

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

以上是如何使用低維索引數組高效索引 N 維數組?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn