ホームページ >バックエンド開発 >Python チュートリアル >(N-1) 次元配列を使用して N 次元配列に効率的にアクセスするにはどうすればよいですか?

(N-1) 次元配列を使用して N 次元配列に効率的にアクセスするにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-21 11:57:03238ブラウズ

How to Access N-Dimensional Array with (N-1)-Dimensional Array Efficiently?

(N-1) 次元配列を使用して N 次元配列にアクセスする

N 次元配列 a と (N- 1) 次元配列 idx の場合、一般的なタスクは、idx のインデックスで指定された要素にアクセスすることです。これは、最大値の検索や特定の値の取得などの操作を実行する場合に役立ちます。

高度なインデックス作成を使用したエレガントなソリューション

エレガントなソリューションには、NumPy の ogrid 関数による高度なインデックス作成の使用が含まれます。 :

<code class="python">m, n = a.shape[1:]
I, J = np.ogrid[:m, :n]
a_max_values = a[idx, I, J]
b_max_values = b[idx, I, J]</code>

これにより、インデックスのメッシュグリッドが作成され、それを使用して a と b にインデックスが付けられ、対応する値を含む配列が得られます。

関数を使用した一般的なケース

任意の指定された軸に対して機能する、より一般的な解決策として、関数を定義できます。

<code class="python">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)]</code>

この関数は、配列、指定された軸に沿ったその argmax、および軸自体を受け取ります。 。次に、メッシュグリッドを構築し、それを使用して対応する要素を抽出します。

カスタム関数による簡素化されたインデックス作成

インデックス作成プロセスをさらに簡略化するために、ヘルパー関数を作成できます。インデックスのグリッドを生成します:

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

この関数は、入力配列にインデックスを付けるために直接使用できるインデックスのタプルを返します:

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

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。