Numpy Masking with Array

时间:2016-05-19 16:55:38

标签: python arrays 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(),但它们似乎只对1D数组起作用。

提前致谢

1 个答案:

答案 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])