ホームページ >バックエンド開発 >Python チュートリアル >別の配列のインデックスを使用して 2D NumPy 配列から要素を抽出する方法
別の配列のインデックスを使用して 2D 配列から要素を抽出する
NumPy では、多次元配列から特定の要素を抽出する必要がある場合があります。別の配列に格納されているインデックスに基づきます。このシナリオは、スパース行列やインデックス付き選択などのデータ構造を扱うときによく発生します。
問題:
2 つの NumPy 配列を考えてみましょう:
A = np.array([[0, 1], [2, 3], [4, 5]]) B = np.array([[1], [0], [1]]) # Index array
目標は、A の各行から 1 つの要素を抽出することです。特定の要素は、対応する行のインデックスによって指定されます。期待される出力は次のようになります:
C = np.array([[1], [2], [5]])
解決策:
1。純粋な整数配列のインデックス作成:
A[np.arange(A.shape[0]), B.ravel()]
この方法には、NumPy の整数配列のインデックス作成機能が使用されます。 A の行に対応するインデックスの範囲を生成し、それを平坦化された配列 B と組み合わせて、適切な要素を選択します。
2.転置と np.choose:
np.choose(B.ravel(), A.T)
この代替アプローチでは、B の形状と一致するように A を転置し、np.choose を使用して平坦化された B 配列に基づいて必要な要素を選択します。
3.反復可能なアンパック (Python >=3.6):
*A = A.T C = np.array([*zip(*A)][i] for i in B.ravel())
このメソッドは、反復可能なアンパックを使用して A を行のリストに変換し、B のインデックスに基づいて A の行を反復して、必要な要素を抽出します。
4.リスト内包表記とブロードキャスト:
[A[i][j] for i, j in zip(range(A.shape[0]), B.ravel())]
リスト内包表記を使用すると、A と B の要素を反復処理し、要素ごとの選択を実行することで、新しい配列を作成できます。
5.ファンシー インデックス作成 (NumPy >=1.18):
A[np.stack([range(A.shape[0]), B.ravel()], axis=1)]
ファンシー インデックス作成により、より効率的でコンパクトなインデックス作成操作が可能になります。この場合、行インデックスと B インデックスを含む 2D 配列が作成され、これを使用して A から目的の要素を選択できます。
最も適切なソリューションは、タスクの特定の要件と制約によって異なります。効率、読みやすさ、NumPy の古いバージョンとの互換性など。
以上が別の配列のインデックスを使用して 2D NumPy 配列から要素を抽出する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。