31

numpy 配列から、またはさらに興味深いことにそのスライスから要素のみを取得する (非常に) 迅速かつ効率的な方法が必要です。numpy 配列があるとします。

import numpy as np
a = np.arange(-10,10)

リストがある場合:

s = [9, 12, 13, 14]

次から要素を選択できます。

a[s]  #array([-1,  2,  3,  4])

条件を満たす a[s] の要素、つまり正 (または負) の (numpy) 配列を作成するにはどうすればよいですか? 結果になるはず

np.ifcondition(a[s]>0, a[s])  #array([2,  3,  4])

些細なことに見えますが、シンプルで凝縮された表現を見つけることができませんでした。マスクはそうだと思いますが、私にはあまり直接的ではありません。ただし、次のいずれもありません。

a[a[s]>0]
a[s[a[s]>0]]

実際には良い選択です。

4

3 に答える 3

33

どうですか:

In [19]: b = a[s]

In [20]: b[b > 0]
Out[20]: array([2, 3, 4])
于 2012-10-23T11:06:38.790 に答える
5

あなたは間違いなくunutbuの答えを受け入れる必要があります。これは、numpy内でこの種の状況に一般的に使用するものです。しかし、物事を行う複数の方法を持つために、numpy の外で動作するメソッドを持つために、または中間配列が攻撃的に巨大な場合に備えて、次の代替手段を追加します。

In [3]: [a[S] for S in s if a[S]>0]
Out[3]: [2, 3, 4]

繰り返しますが、unutbu の方法は大幅に高速です。しかし、この方法はさらに一般化できるので気に入っています。コストのかかるファンキーな関数 (たとえば、インデックス作成ではない) があり、その関数の結果をテストしたい場合は、次のようにすることをお勧めします。

In [5]: [f for S in s for f in [FunkyFunction(a[S])] if f>0]
Out[5]: [2, 3, 4]

これに関する奇妙な部分は、他のリスト内にリストを作成することですが、この内部リストには項目が 1 つしか含まれていません。基本的には、値を variable に保存し、fその値を 2 回使用します。1 回目は値 ( f>0) をテストし、1 回目はテストに合格した場合にリストでその値を使用します。

于 2012-10-23T14:07:53.543 に答える