2015-02-10 76 views
9

說,我有一個numpy的陣列由10元素,即:設置numpy的數組元素爲零,如果他們是到特定閾值

a = np.array([2, 23, 15, 7, 9, 11, 17, 19, 5, 3])

現在我要有效地將所有a值高比100,所以我會得到:

[2, 0, 0, 7, 9, 0, 0, 0, 5, 3]

如何能夠做到在最有效的方式,哈哈記住大數組,例如10^6元素?

因爲我用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 

預先感謝您。

回答

6

一般來說,列表解析在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函數執行得更好。

34
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]) 
+0

完美答案。請注意,如果您碰巧關心您可以使用的元素的絕對值:a [np.abs(a)> 10] = 0 – 2017-12-07 04:28:24

相關問題