[英]How can I do this python list comprehension in NumPy?
假設我有一個值數組r
,范圍從0
到1
。 我想刪除距離中位數有些閾值的所有值。 我們假設這個閾值是0.5
, len(r) = 3000
。 然后為了掩蓋這個范圍之外的所有值,我可以做一個簡單的列表理解,我喜歡:
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)
(r<minv) | (r>maxv)
Numpy邏輯或: r[np.logical_or(r<minr, r>maxr)]
絕對差值布爾數組: abs(mr) > 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
正如你所看到的,elementwise Or總是最快的,幾乎是兩倍(不知道如何用數組元素縮放)。 誰知道。
您可以使用numpy條件選擇來創建新數組,而不使用這些值。
start = time.time()
m = np.median(r)
maxr,minr = m-0.5, m+0.5
filtered_array = r[ (r < minr) | (r > maxr) ]
end = time.time()
print('Took %.4f seconds'%(end-start))
filtered_array
是沒有屏蔽值的r
片段(稍后將通過在filtered_array
刪除的掩碼刪除所有值)。
更新:使用@ayhan建議的較短語法。
一個班輪......
new_mask = abs(np.median(r) - r) > 0.5
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.