低次元のインデックス配列を使用して N 次元配列に効率的にインデックスを付けるにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-10-21 13:09:02
オリジナル
923 人が閲覧しました

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)
ログイン後にコピー

この関数を使用すると、axis 軸に沿った idx を使用して配列 a にインデックスを付けることができます。

axis = 0
a_max_values = a[all_idx(idx, axis=axis)]
ログイン後にコピー

以上が低次元のインデックス配列を使用して N 次元配列に効率的にインデックスを付けるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!