说,我有一个由10
元素组成的numpy数组,例如:
a = np.array([2, 23, 15, 7, 9, 11, 17, 19, 5, 3])
现在我想有效地将所有a
值设置为高于10
到0
,所以我会得到:
[2, 0, 0, 7, 9, 0, 0, 0, 5, 3]
因为我目前使用for
循环,这非常慢:
# Zero values below "threshold value".
def flat_values(sig, tv):
"""
:param sig: signal.
:param tv: threshold value.
:return:
"""
for i in np.arange(np.size(sig)):
if sig[i] < tv:
sig[i] = 0
return sig
如何以最有效的方式实现这一目标,考虑到10^6
元素的大数组?
答案 0 :(得分:65)
In [7]: a = np.array([2, 23, 15, 7, 9, 11, 17, 19, 5, 3])
In [8]: a[a > 10] = 0
In [9]: a
Out[9]: array([2, 0, 0, 7, 9, 0, 0, 0, 5, 3])
答案 1 :(得分:20)
通常,列表推导比python中的for
循环更快(因为python知道它不需要关心常规for
循环中可能发生的很多事情) :
a = [0 if a_ > thresh for a_ in a]
但是,正如@unutbu正确pointed out,numpy允许列表索引,并且元素方式比较为您提供索引列表,所以:
super_threshold_indices = a > thresh
a[super_threshold_indices] = 0
会更快。
通常,在数据向量上应用方法时,请查看numpy.ufuncs
,它通常比使用任何本机机制映射的python函数执行得更好。
答案 2 :(得分:2)
如果您不想更改原始数组
In [1]: import numpy as np
In [2]: a = np.array([2, 23, 15, 7, 9, 11, 17, 19, 5, 3])
In [3]: b = a * (a <= 10)
In [4]: a
Out[4]: array([ 2, 23, 15, 7, 9, 11, 17, 19, 5, 3])
In [5]: b
Out[5]: array([2, 0, 0, 7, 9, 0, 0, 0, 5, 3])
答案 3 :(得分:0)
从senddex在Youtube上从零开始的神经网络系列,他用np.maximum(0, [your array])
把所有小于0的值都变成了0。
对于您的问题,我尝试了 np.minimum(10, [your array])
,它似乎运行得非常快。我什至在一个 10e6 的数组(使用 50 * np.random.rand(10000000)
生成的均匀分布)上做了它,它在 0.039571 秒内工作。我希望这足够快。