我如何在 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 制作掩码?


编辑:

我尝试了以下几个建议,包括:

这里是每个人在 300 次运行后的平均时间:

Python list comprehension: 0.6511 ms
Elementwise or: 0.0138 ms
Numpy logical or: 0.0241 ms
Absolute difference: 0.0248 ms

如您所见,按元素的 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_arrayr 的切片,没有屏蔽值(稍后将被屏蔽删除的所有值已在 filtered_array 中删除)。

更新:使用@ayhan 建议的较短语法。

一个班轮...

new_mask = abs(np.median(r) - r) > 0.5