2017-02-21 13 views
2

私は最近、自分の実験のためにデータを分析するために自分自身にpythonを教えてくれました。そういうわけで、私は多くの面で非常に無知です。私は特定のファイルに対して分析を実行させることができましたが、場合によってはそれが故障し、誤ったプログラミングの結果であると想像しています。Pythonを使ってDelta F/Fを計算するには?

現在、3つのnumpy配列を含むファイルをエクスポートします。これらの配列の1つは私のシグナルです(float値は-10から10)。私がしたいのは、この配列内のすべてのデータを先行する値の範囲に正規化することです。 (すなわち、30001stの値は、その前の3000の値から平均値を差し引いたものでなければならず、その差をこの同じ平均(過去3000値)で除算する必要があります。 ALST 30代の私が先行3000valuesを使用する必要があります

を、それはスタンドとして、これは私はそれを動作させることができた方法です:。

が、これは変数photosignal

photosignal = np.array(seg.analogsignals[0], ndmin=1) 
に信号を保存します

これは私が得るために使う部分です後で私が同じである別のリストにそれをロック時間なければならないので、以下の30代の移動ウィンドウ

normalizedphotosignal = [(uu-(np.mean(photosignal[uu-3000:uu])))/abs(np.mean(photosignal[uu-3000:uu])) for uu in photosignal[3000:]] 

超えるデルタF/Fは、配列を同じ長さを保つために先頭に3000個の値を追加します私が気づいた何の長さ

holder =list(range(3000)) 
normalizedphotosignal = holder + normalizedphotosignal 

それは「スライス」が空であることを述べているので、それが平均値を作成することはできませんので、特定のファイルで、このコードは私にエラーを与えることです。

私は多分この問題を完全に避けることができるこれをプログラムするよりよい方法があると思います。または、これはこの問題に近づく正しい方法ですか?

私は解決策を試しましたが、それはかなり遅く、それにもかかわらず、まだ私に "空のスライスエラー"を与えます。 私は移動平均ポストの上に行って、この方法が見つかりました:

def running_mean(x, N): 
cumsum = np.cumsum(np.insert(x, 0, 0)) 
return (cumsum[N:] - cumsum[:-N])/N 

しかし、私は私の所望の出力にそれを収容し、トラブルを抱えているが。すなわち(xランニング平均)/走行平均

答えて

2

あなたのアプローチは正しい方向に向いています。しかし、あなたのリストの理解に誤りがありました。uuをインデックスとして使用し、uuは入力データphotosignalの要素です。

normalizedphotosignal2 = np.zeros((photosignal.shape[0]-3000)) 
for i, uu in enumerate(photosignal[3000:]): 
    normalizedphotosignal2 = (uu - (np.mean(photosignal[i-3000:i])))/abs(np.mean(photosignal[i-3000:i])) 

は、forループのpythonで比較的遅いことに注意してください:

あなたはこのような何かをしたいです。ここでパフォーマンスが問題になる場合は、forループを避けて、代わりにnumpyメソッドを使用してみてください(たとえば、Moving average or running meanをご覧ください)。

これが役に立ちます。

+0

ありがとうalotはあなたが言った移動平均numpyメソッドと一緒にそれを試してみましょう! –

+1

どこで 'i'を使いますか?あなたは 'i-3000:i'を使うのですか? –

+0

@DavidCullen:あなたは正しいです...私は修正するために設定したエラーを修正するのを忘れていました... –

2

私はあなたの助けとあなたが私に紹介した投稿に感謝しました。

私のデータ全体(300000 +)の計算には約1秒かかります!

私は、次のコードを使用:

def runningmean(x,N): 
    cumsum =np.cumsum(np.insert(x,0,0)) 
    return (cumsum[N:] -cumsum[:-N])/N 

photosignal = np.array(seg.analogsignal[0], ndmin =1) 

photosignalaverage = runningmean(photosignal, 3000) 
holder = np.zeros(2999) 
photosignalaverage = np.append(holder,photosignalaverage) 

detalfsignal = (photosignal-photosignalaverage)/abs(photosignalaverage) 

Photosignalがnumpyの配列に私の生の信号を格納します。 PhotosignAlverageは、cumsumを使用して、光信号内のすべてのデータポイントの移動平均を計算します。最初の2999の値を0として追加し、光信号と同じリストサイズをmaintianに追加します。

次に、デルタF/F信号を得るために基本的なnumpy計算を使用します。

フィードバックをもう一度いただきありがとうございました。本当に役に立ちました!

関連する問題