我不确定提出这个问题的最佳方式,所以我提前道歉。
我试图在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(),但它们似乎只对1D数组起作用。
提前致谢
答案 0 :(得分: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)
我也可以选择这些值,但这种方式会失去2d结构。
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])