低次元配列を使用した多次元配列へのアクセス
多次元配列では、低次元の配列を使用して特定の次元に沿って値を取得できます。挑戦的。以下の例を考えてみましょう:
<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>
a.max(axis=0) を使用したかのように、idx を使用して a の最大値にアクセスするにはどうすればよいでしょうか? b から対応する値を取得するにはどうすればよいですか?
高度なインデックス作成を使用したエレガントなソリューション
高度なインデックス作成は、これを実現する柔軟な方法を提供します。
<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>
このソリューションは、グリッド [idx, I, J] が残りの次元のインデックスの可能なすべての組み合わせにまたがるという事実を利用します。
任意の次元の一般化
一般的な n 次元配列の場合、上記の解決策を一般化する関数を定義できます。
<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>
Alternative Indexing Method
または、関数を作成できます。すべての軸のインデックスのグリッドを生成するには:
<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">a_max_values = a[all_idx(idx, axis=axis)] b_max_values = b[all_idx(idx, axis=axis)]</code>
以上が低次元配列を効果的に使用して多次元配列の値にアクセスするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。