我如何在 NumPy 中执行此 python 列表理解?
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)
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
如您所见,按元素的 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
假设我有一个值数组 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)
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
如您所见,按元素的 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