如何用python计算Delta F / F?

时间:2017-02-21 10:01:32

标签: python numpy iterator

我最近"教过"我自己用python来分析我的实验数据。因此,我在很多方面都很无能为力。我设法让我的分析工作某些文件,但在某些情况下,它会崩溃,我想这是编程错误的结果。

目前我导出的文件包含3个numpy数组。其中一个数组是我的信号(浮点值从-10到10)。我想要做的是将此数组中的每个数据规范化为其前面的一系列值。 (即30001st值必须从它中减去前面3000个值的平均值,然后必须将该差除以这个相同的平均值(前面的3000个值)。我的数据以100Hz的速率收集,从而得到归一化我必须使用前面的3000个值。

就目前而言,这是我设法使其发挥作用的方式:

将信号存储到变量photosignal

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

现在我用这个部分来获得30秒移动窗口的delta F / F

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

我注意到的是,在某些文件中,此代码会给我一个错误,因为它表示" slice"是空的,因此无法创造平均值。

我想也许有更好的方法来编程,可以完全避免这个问题。或者这是解决这个问题的正确方法吗?

所以我尝试了解决方案,但它很慢,但它仍然给了我"空切片错误"。 我走过移动平均线,找到了这个方法:

def running_mean(x, N):
 cumsum = np.cumsum(np.insert(x, 0, 0))
 return (cumsum[N:] - cumsum[:-N]) / N 
但是,我无法将其容纳到我想要的输出中。即(x-运行平均值)/运行平均值

2 个答案:

答案 0 :(得分: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)。

希望这有帮助。

答案 1 :(得分:2)

好吧,所以我终于想通了,感谢你的帮助和你推荐给我的帖子。

我的整个数据(300 000 +)的计算大约需要一秒钟!

我使用了以下代码:

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数组中。 Photosignalaverage使用cumsum计算photosignal中每个数据点的运行平均值。然后我将前2999个值添加为0,以与我的photosignal相同的列表大小。

然后我使用基本的numpy计算来得到我的delta F / F信号。

再次感谢您的反馈,真的很有帮助!