2016-05-19 11 views
1

私はこの質問をする最善の方法ではないので、事前にお詫び申し上げます。Numpy Masking with Array

私は、NxM個のオーディオ信号の配列の各行にピークを見つけることを試みています。配列の各行は個別に扱われ、周波数空間の配列の各Nに対して、すべての値にノイズフロアを超える標準偏差の特定の数を取得したいと思います。この実験では、400Hz以上の信号がないので、ノイズフロアとして使用しています。私はマスクするときに問題にぶつかっています。 ma.masked_lessは、単一の値で動作し、になりませんので、私はこれがあると推定しました

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

:この例では、誤差が発生します

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) 

:ここに私のコードスニペットですアレイ。私は出力が条件よりも大きな値のNxM配列であることを望みます。私が好きなことや効率的なやり方をするナンシーな方法がありますか?

私はpeakUtilsやscipy.signal.find_peaks_cwt()などのいくつかのピーク検出ルーチンも見てきましたが、それらは1D配列に対してのみ動作するようです。マスクされた配列を使用したにすぎ入る前に事前

答えて

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

Iが2Dアレイを有し、私が行ごとに異なる値で<マスクを適用しよう。

代わり私はxに一致2Dアレイとしてマスクを生成することができる:

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) 

Iはまた、値を選択することができ、しかし、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]) 
+0

これはトリックを行ったようです。ありがとう! – nanoPhD