2016-10-31 8 views
1

suitCountsからmaxsuitで指定されたn番目の要素を選びたいと思います。私はmaxsuit配列をブロードキャストしたので、結果は得られましたが、目的のものは得られませんでした。私が概念的に間違ってやっている提案は感謝しています。私はnp.choose(self.maxsuit[:,:,None]-1, self.suitCounts)の結果を理解していませんが、これは私が探しているものではありません。np.chooseはブロードキャスト後に希望の結果を与えません。

>>> self.maxsuit 
Out[38]: 
array([[3, 3], 
     [1, 1], 
     [1, 1]], dtype=int64) 

>>> self.maxsuit[:,:,None]-1 
Out[33]: 
array([[[2], 
     [2]], 

     [[0], 
     [0]], 

     [[0], 
     [0]]], dtype=int64) 
>>> self.suitCounts 
Out[34]: 
array([[[2, 1, 3, 0], 
     [1, 0, 3, 0]], 

     [[4, 1, 2, 0], 
     [3, 0, 3, 0]], 

     [[2, 2, 0, 0], 
     [1, 1, 1, 0]]]) 
>>> np.choose(self.maxsuit[:,:,None]-1, self.suitCounts) 
Out[35]: 
array([[[2, 2, 0, 0], 
     [1, 1, 1, 0]], 

     [[2, 1, 3, 0], 
     [1, 0, 3, 0]], 

     [[2, 1, 3, 0], 
     [1, 0, 3, 0]]]) 

望ましい結果は次のようになります。あなたがそうのような配列のインデックスにブロードキャスト方法をadvanced-indexingを使用することができ

[[3,3],[4,3],[2,1]] 

答えて

1

-

In [415]: val  # Data array 
Out[415]: 
array([[[2, 1, 3, 0], 
     [1, 0, 3, 0]], 

     [[4, 1, 2, 0], 
     [3, 0, 3, 0]], 

     [[2, 2, 0, 0], 
     [1, 1, 1, 0]]]) 

In [416]: idx  # Indexing array 
Out[416]: 
array([[3, 3], 
     [1, 1], 
     [1, 1]]) 

In [417]: m,n = val.shape[:2] 

In [418]: val[np.arange(m)[:,None],np.arange(n),idx-1] 
Out[418]: 
array([[3, 3], 
     [4, 3], 
     [2, 1]]) 

ビットクリーンな方法をnp.ogridとオープンレンジアレイを使用する -

In [424]: d0,d1 = np.ogrid[:m,:n] 

In [425]: val[d0,d1,idx-1] 
Out[425]: 
array([[3, 3], 
     [4, 3], 
     [2, 1]]) 
+0

素晴らしいことだ、ただ不思議、np.chooseでそれを行う方法もあるのでしょうか? – Nickpick

+0

@nickpick申し訳ありません。私は 'np.choose'をあまり使っていません。私はちょうどそれを直接的なやり方でやりたい。 – Divakar

+0

意味があります。ファンシー索引作成の専門家のようです。あなたが推薦できる文献はありますか? – Nickpick

0

これは、私が選ん

In [23]: np.choose([[1,2,0],[1,2,0]], suitcounts[:,:,:3]) 
Out[23]: 
array([[4, 2, 3], 
     [3, 1, 3]]) 

chooseでできる最善である私たちは、むしろ単一のものよりも、アレイのリストを使用することを好みます。それは誤用を防ぐためのものです。だから、問題はように記述することができます:出力の形状は、インデックス配列と一致します

In [25]: np.array([[1,2,0],[1,2,0]]) 
Out[25]: 
array([[1, 2, 0], 
     [1, 2, 0]]) 

In [24]: np.choose([[1,2,0],[1,2,0]], [suitcounts[0,:,:3], suitcounts[1,:,:3], suitcounts[2,:,:3]]) 
Out[24]: 
array([[4, 2, 3], 
     [3, 1, 3]]) 

アイデアは次のようにインデックス配列に基づいて、3個のサブアレイから項目を選択することです。 choise配列の形状も一致しているので、[...,:3]を使用しています。最初の列の

値はsuitcounts[2...]から2番目の列に、suitcounts[1,:,:3]から選択される等

choose 32回の選択に制限されています。これはブロードキャストメカニズムによって課される制限です。私は表現

In [26]: np.choose([1,2,0], suitcounts[:,:,:3]) 
Out[26]: 
array([[4, 2, 3], 
     [3, 1, 3]]) 

を簡素化することができ、放送の

言えばこれは、サブアレイの2×3の形状に合わせて[1,2,0]を放送します。私は列を並べ替えることにより、目的の順序を得ることができ

In [27]: np.choose([0,1,2], suitcounts[:,:,[2,0,1]]) 
Out[27]: 
array([[3, 4, 2], 
     [3, 3, 1]]) 
関連する問題