2017-02-21 26 views
2

我最近「教」自己python爲了分析我的實驗數據。因此,我在很多方面都很無知。我已經設法對某些文件進行分析,但在某些情況下會崩潰,我認爲這是編程錯誤的結果。如何使用python來計算Delta F/F?

目前我導出一個包含3個numpy數組的文件。其中一個數組是我的信號(浮點值從-10到10)。我想要做的就是將此數組中的每個數據規範化爲其前面的一系列值。 (即第30001個值必須具有從其中減去前3000個值的平均值,然後該差值必須除以這個相同的平均值(前面的3000個值)。以100Hz的速率收集我的數據,從而得到歸一化在30年代ALST我必須使用前述3000values

因爲它忍受這就是我是如何設法使其工作:

這個存儲信號到變量photosignal

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

現在這個我用來獲取的部分增量F/F超過30歲的

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

以下的移動窗口增加了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

非常感謝你將會和你提到的移動平均numpy方法一起嘗試! –

+1

你在哪裏使用'i'?你的意思是使用'i-3000:i'嗎? –

+0

@DavidCullen:你是對的..我忘了解決我要解決的錯誤... –

2

好吧,所以我終於想通了,謝謝你的幫助和你引薦我的帖子。

我的整個數據(300 000+)的計算大概需要一秒鐘!

我用下面的代碼:在numpy的陣列

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存儲我的原始信號。 Photosignalaverage使用cumsum來計算光信號中每個數據點的連續平均值。然後我將第一個2999的值加爲0,以保存與我的照片信號相同的列表大小。

然後,我使用基本的numpy計算來獲得我的delta F/F信號。

再次感謝您的反饋意見,真的很有幫助!