如何在NumPy中理解python列表?

如何在NumPy中理解python列表?,python,arrays,numpy,masking,bitmask,Python,Arrays,Numpy,Masking,Bitmask,假设我有一个值数组,r,范围从0到1。我想删除所有远离中值的阈值。让我们在这里假设阈值是0.5,并且len(r)=3000。然后为了掩盖这个范围之外的所有值,我可以做一个简单的列表理解,我喜欢: mask=np.数组([rinp.中值(r)+0.5表示r中的ri]) 如果我在上面使用计时器: import time import numpy as np start = time.time() r = np.random.random(3000) m = np.median(r) maxr,mi

假设我有一个值数组,
r
,范围从
0
1
。我想删除所有远离中值的阈值。让我们在这里假设阈值是
0.5
,并且
len(r)=3000
。然后为了掩盖这个范围之外的所有值,我可以做一个简单的列表理解,我喜欢:

mask=np.数组([rinp.中值(r)+0.5表示r中的ri])

如果我在上面使用计时器:

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))

正如您所看到的,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))
start=time.time()
m=np.中值(r)
最大值,最小值=m-0.5,m+0.5
过滤的_数组=r[(rmaxr)]
end=time.time()
打印('花费%.4f秒'%(结束-开始))
filtered_array
r
的一部分,没有屏蔽值(所有稍后将被屏蔽删除的值都已在
filtered_array
中删除)

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

一行

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

[ri@ayhan是的,很抱歉,最小值和最大值也是失败的尝试
(r>maxr)|(r
相反。
用于元素或。我相信
np。逻辑或
使用相同的方法,因此差异应该来自其他方面
abs
可能需要更长的时间,你是对的。@ayhan不,它们不一样。它们只在布尔数组上工作。我在p上有相同的结果性能测试和你一样。但我相信这取决于硬件。这是最快的,谢谢。虽然你最初使用
np.logical\u或()
的答案较慢。当需要发行版的尾部时非常有用。我喜欢清晰。
new_mask = abs(np.median(r) - r) > 0.5