2016-05-19 27 views
1

我不確定詢問這個問題的最佳方式,所以我提前道歉。用數組掩蓋Numpy掩碼

我試圖在音頻信號的NxM numpy陣列的每一行上找到峯值。數組中的每一行都是單獨處理的,我希望對於頻率空間中的每個N,在噪聲基底上獲得一定數量的標準偏差。在這個實驗中,我知道我沒有400Hz以上的信號,所以我使用它作爲我的本底噪聲。我試圖掩蓋時遇到問題。這裏是我的代碼片段:

from scipy import signal 
import numpy as np 


Pxx_den = signal.periodogram(input, fs=sampleRate ,nfft=sampleRate,axis=1) 
p = np.array(Pxx_den)[1].astype(np.float) 
noiseFloor = np.mean(p[:,400:],axis=1) 
stdFloor = np.std(p[:,400:],axis=1) 
p = np.ma.masked_less(p,noiseFloor+stdFloor*2) 

這個例子會產生一個錯誤:

ValueError: operands could not be broadcast together with shapes (91,5001) (91,) 

我推斷,這是因爲ma.masked_less處理單個值,並在不採取陣列。我希望輸出是一個大於條件的NxM數組值。有沒有一個Numpy的方式做我想做的或有效的替代品?

我也看過一些峯值檢測例程,如peakUtils和scipy.signal.find_peaks_cwt(),但它們似乎只對一維數組起作用。

在此先感謝

回答

3

在深入研究中使用屏蔽陣列之前,確保下面的代碼處理它們。它必須知道掩碼數組是如何工作的,或者推遲使用掩碼數組方法。

至於具體的問題,我認爲這是重新創建:

In [612]: x=np.arange(10).reshape(2,5) 

In [613]: np.ma.masked_less(x,np.array([3,6])) 
... 
ValueError: operands could not be broadcast together with shapes (2,5) (2,) 

我有一個二維數組,我嘗試與每行不同的值應用<面膜。

相反,我可以生成掩模作爲二維數組匹配x

In [627]: mask= x<np.array([3,6])[:,None] 

In [628]: np.ma.masked_where(mask,x) 
Out[628]: 
masked_array(data = 
[[-- -- -- 3 4] 
[-- 6 7 8 9]], 
      mask = 
[[ True True True False False] 
[ True False False False False]], 
     fill_value = 999999) 

我還可以選擇的值,雖然在失去二維結構的方法。

In [631]: x[~mask] 
Out[631]: array([3, 4, 6, 7, 8, 9]) 

In [632]: np.ma.masked_where(mask,x).compressed() 
Out[632]: array([3, 4, 6, 7, 8, 9]) 
+0

這似乎已經成功了。謝謝! – nanoPhD