ホームページ  >  記事  >  バックエンド開発  >  高度な Numpy インデックスを使用して行列行を効率的にローリングするにはどうすればよいですか?

高度な Numpy インデックスを使用して行列行を効率的にローリングするにはどうすればよいですか?

DDD
DDDオリジナル
2024-10-21 13:40:03382ブラウズ

How to Efficiently Roll Matrix Rows with Advanced Numpy Indexing?

Numpy の高度なインデックスによる効率的な行列行ローリング

問題ステートメント:

行列とロール値の配列が与えられた場合の場合、タスクは、対応するロール値に従って行列の各行を個別にロールすることです。例:

A = np.array([[4, 0, 0],
              [1, 2, 3],
              [0, 0, 5]])

r = np.array([2, 0, -1])

expected_result = np.array([np.roll(row, x) for row,x in zip(A, r)])

# [[0 0 4]
#  [1 2 3]
#  [0 5 0]]

Numpy の高度なインデックス作成を使用したソリューション:

行列行を個別にローリングする効率的なアプローチは、Numpy の高度なインデックス作成機能を活用することです:

<code class="python">import numpy as np

rows, column_indices = np.ogrid[:A.shape[0], :A.shape[1]]

# Ensure negative shift to keep column_indices valid
r[r < 0] += A.shape[1]
column_indices = column_indices - r[:, np.newaxis]

result = A[rows, column_indices]</code>

説明:

  • 行列の行と列を表す np.ogrid を使用してインデックスのグリッドを作成します。
  • ロールを調整します値を使用して負のシフトを確保し、有効な列インデックスを取得します。
  • 列インデックス グリッドからロール値を減算し、行に沿ってロール値をブロードキャストします。
  • 高度なインデックス作成を使用して、ロールされたインデックスを取得します。元の行列 A の要素。

このアプローチにより、明示的な for ループをバイパスし、Numpy の強力なベクトル化演算を利用して、効率的かつ簡潔な行ローリングが可能になります。それが最速の方法であるかどうかは、配列の次元と特定のシステム構成によって異なります。

以上が高度な Numpy インデックスを使用して行列行を効率的にローリングするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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