问题描述
说,我有一个由10
元素组成的numpy数组,例如:
Say, I have a numpy array consists of 10
elements, for example:
a = np.array([2, 23, 15, 7, 9, 11, 17, 19, 5, 3])
现在,我想有效地将所有高于10
的a
值设置为0
,因此我将得到:
Now I want to efficiently set all a
values higher than 10
to 0
, so I'll get:
[2, 0, 0, 7, 9, 0, 0, 0, 5, 3]
因为我当前使用的是for
循环,所以循环非常慢:
Because I currently use a for
loop, which is very slow:
# 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
元素的数组,如何以最有效的方式实现这一目标?
How can I achieve that in the most efficient way, having in mind big arrays of, say, 10^6
elements?
推荐答案
通常,列表理解比python中的for
循环要快(因为python知道它不需要关心很多可能发生的事情)在常规的for
循环中):
Generally, list comprehensions are faster than for
loops in python (because python knows that it doesn't need to care for a lot of things that might happen in a regular for
loop):
a = [0 if a_ > thresh else a_ for a_ in a]
但是,由于@unutbu正确地指出了,numpy允许列表索引和逐元素比较为您提供索引列表,所以:
but, as @unutbu correctly pointed out, numpy allows list indexing, and element-wise comparison giving you index lists, so:
super_threshold_indices = a > thresh
a[super_threshold_indices] = 0
会更快.
通常,在对数据向量应用方法时,请查看numpy.ufuncs
,它通常比使用任何本机机制映射的python函数要好得多.
Generally, when applying methods on vectors of data, have a look at numpy.ufuncs
, which often perform much better than python functions that you map using any native mechanism.
这篇关于如果numpy数组元素高于特定阈值,则将它们设置为零的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!