【问题标题】:Numpy Masking with Array带有数组的 Numpy 掩码
【发布时间】:2016-05-20 01:23:09
【问题描述】:

我不确定提出这个问题的最佳方式,所以我提前道歉。

我正在尝试在 NxM numpy 音频信号数组的每一行上找到一个峰值。数组中的每一行都是单独处理的,我希望在频率空间中为数组中的每个 N 获得高于噪声基底一定数量的标准偏差的所有值。在这个实验中,我知道我没有高于 400Hz 的信号,所以我将其用作本底噪声。我在尝试掩盖时遇到了问题。这是我的代码 sn-p:

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(),但它们似乎只作用于一维数组。

提前致谢

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    在深入使用屏蔽数组之前,请确保以下代码能够处理它们。它必须知道掩码数组是如何工作的,或者遵循掩码数组方法。

    至于具体的问题,我认为这是重新创建它:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-23
      • 1970-01-01
      • 1970-01-01
      • 2019-10-12
      • 2019-09-23
      • 1970-01-01
      • 2014-09-08
      相关资源
      最近更新 更多