4

私は一般的に行っている操作を持っていますが、それを「ギザギザスライス」と呼んでいます。その本当の名前がわからないからです。例によって最もよく説明されています:

a = np.random.randn(50, 10)
entries_of_interest = np.random.randint(10, size = 50)  # Vector of 50 indices between 0 and 9
# Now I want the values contained in each row of a at the corresponding index in "entries of interest"
jagged_slice_of_a = a[np.arange(a.shape[0]), entries_of_interest]
# jagged_slice_of_a is now a vector with 50 elements.  Good.

唯一の問題は、このインデックス作成を行うのが少し面倒なことですa[np.arange(a.shape[0]), entries_of_interest](このためだけに "np.arange(a.shape[0])" を作成する必要があるのはばかげているようです)。:これにはオペレーターのようなものが欲しいのですが、 は別の:ことをします。この操作を行うためのより簡潔な方法はありますか?

ベストアンサー:

いいえ、ネイティブ numpy を使用するより良い方法はありません。必要に応じて、このためのヘルパー関数を作成できます。

4

3 に答える 3

3

あなたの現在の方法がおそらく最良の方法だと思います。

このような選択にも使用できますchoose。これは構文的にはより明確ですが、正しく理解するのが難しく、より制限される可能性があります。このメソッドと同等のものは次のようになります。

entries_of_interest.choose(a.T)
于 2015-11-16T13:06:10.637 に答える
1

これは、非常に単純に見えるタスクに対してより多くの入力が必要になるという意味でのみ、面倒です。

a[np.arange(a.shape[0]), entries_of_interest]

しかし、お気づきのように、構文的に単純な方a[:, entries_of_interest]には別の解釈がありnumpyます。配列の列のサブセットを選択することは、各行から 1 つの (ランダムな) 項目を選択するより一般的なタスクです。

あなたのケースは、の特殊なインスタンスにすぎません

a[I, J]

ここでI、 とJは同じ形状の 2 つの配列です。一般的なケースentries_of_interestでは、(すべての行ではなく) より小さいa.shape[0]か、より大きい (いくつかの行からのいくつかの項目)、または 2d でさえある可能性があります。特定の要素を繰り返し選択することさえできます。

他の SO の質問で、この種の要素選択を実行すると、 に適用すると高速になることがわかりましたa.flatI*n+Jただし、フラット インデックスのようなものを作成するには、ある程度の計算が必要です。

の特別な知識があるとJ、構築Iは余分な作業のように見えますがnumpy、そのような仮定を立てることはできません。この選択がより一般的である場合、誰かがあなたの式をラップする関数を書くことができます

def  peter_selection(a,I):
   # check the a.shape[0]==I.shape[0]
   return a[np.arange(a.shape[0]), I]
于 2015-11-16T17:27:21.683 に答える