たとえば、0
から1
までの範囲の値の配列r
があります。私は中央値からある閾値であるすべての値を取り除きたい。ここで、その閾値が0.5
であり、len(r) = 3000
であると仮定しよう。そして、この範囲外のすべての値をマスクするために、私は私の好きなシンプルなリスト内包、行うことができます。NumPyでこのPythonリストの理解をどうやって行えますか?
mask = np.array([ri < np.median(r)-0.5 or ri > np.median(r)+0.5 for ri in r])
を、私はそれにタイマーを使用する場合:
import time
import numpy as np
start = time.time()
r = np.random.random(3000)
m = np.median(r)
maxr,minr = m-0.5, m+0.5
mask = [ri<minr or ri>maxr for ri in r]
end = time.time()
print('Took %.4f seconds'%(end-start))
>>> Took 0.0010 seconds
このリストの理解を迅速に行う方法はありますか?NumPy
を使用してマスクを作成しますか?
編集:私は含めて、以下のいくつかの提案を試みた
:
要素単位またはオペレータ:
(r<minv) | (r>maxv)
A numpyの論理的か:
r[np.logical_or(r<minr, r>maxr)]
絶対差ブール配列:
abs(m-r) > 0.5
そして、ここでは、それぞれが通過300の実行後にかかった平均時間です:あなたが見ることができるように、
Python list comprehension: 0.6511 ms
Elementwise or: 0.0138 ms
Numpy logical or: 0.0241 ms
Absolute difference: 0.0248 ms
要素ごとのか、常に最速だったが、ほぼ2倍になります(配列要素でどのようにスケーリングされるのかわかりません)。誰かわかったね。
'[RI <'ここにマイナス記号タイプミスです-maxr? – ayhan
@ayhan yea申し訳ありませんが、最小値と最大値が無効になりました。 – Anonymous
Try '(r> maxr)| (r
ayhan