2016-06-18 2 views
2
例えば

、私は2つのnumpyのアレイ、別の配列の2番目のdimのインデックスとしてnumpy配列を使用していますか?

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

を有し、IはAの各行からの1つの要素を抽出すると、その要素はBによって索引付けされるので、私は以下の結果たい:

C = np.array(
    [[1], 
    [2], 
    [5]]) 

A[:, B.ravel()]を試しましたが、私が欲しいのではなく、Bを放送します。また、np.takeを見て、私の問題に適切な解決策ではないようです。

しかし、私は、Aを転置によって

np.choose(B.ravel(), A.T) 

が、他のよりよい解決策をnp.chooseを使用することができますか?

+1

可能な重複:http://stackoverflow.com/q/37878946/190597 – unutbu

+0

@unutbuさて、ここでは異なるの並べ替え、我々は行ごとに一つの要素として選択されますリンクされた前の質問の行ごとに複数の要素に反対する。 – Divakar

+0

@Divakar:オペレータが2D配列「C」を望む場合、リンクされたページ上の答えは、望む結果を正確に与えます。 – unutbu

答えて

1

を使うことができNumPy's purely integer array indexing -

A[np.arange(A.shape[0]),B.ravel()] 

サンプル実行 -

In [57]: A 
Out[57]: 
array([[0, 1], 
     [2, 3], 
     [4, 5]]) 

In [58]: B 
Out[58]: 
array([[1], 
     [0], 
     [1]]) 

In [59]: A[np.arange(A.shape[0]),B.ravel()] 
Out[59]: array([1, 2, 5]) 

B1D配列またはそのような列のインデックスのリストであるならば、あなたは、単に平坦化操作をスキップすることができることに注意してください.ravel()

サンプル実行 -

In [186]: A 
Out[186]: 
array([[0, 1], 
     [2, 3], 
     [4, 5]]) 

In [187]: B 
Out[187]: [1, 0, 1] 

In [188]: A[np.arange(A.shape[0]),B] 
Out[188]: array([1, 2, 5]) 
+0

全く放送していないのですか? – avocado

+0

質問から正しい出力が得られれば、ここで放送する必要はありません。基本的には、それぞれのdimで整数を使用して要素を選択しています。私たちは 'B'から2番目のdimインデックスを持っているので、' np.arange'を使って最初のdimに対して対応するものを作成するだけでした。それが理にかなったことを願って! – Divakar

0
C = np.array([A[i][j] for i,j in enumerate(B)]) 
関連する問題