簡體   English   中英

如何在NumPy中執行此python列表理解?

[英]How can I do this python list comprehension in NumPy?

假設我有一個值數組r ,范圍從01 我想刪除距離中位數有些閾值的所有值。 我們假設這個閾值是0.5len(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM