如何使用python计算Delta F/F?

2024-03-29 06:49:47 发布

您现在位置:Python中文网/ 问答频道 /正文

为了分析实验数据,我最近自学了python。因此,我在很多方面都很无知。我已经设法使我的分析对某些文件有效,但在某些情况下,它崩溃了,我认为这是错误编程的结果。在

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

就目前情况来看,我是如何做到这一点的:

这将信号存储到变量photosignal

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

这是我用来得到30秒移动窗口上的△F/F的部分

^{pr2}$

下面将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-运行平均值)/运行平均值


Tags: 文件数据方法信号错误np情况切片
2条回答

好吧,多亏了你的帮助和你介绍给我的帖子,我终于明白了。在

计算我的全部数据(300000+)大约需要一秒钟!在

我使用了以下代码:

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添加到maintian,其大小与我的photosignal相同。在

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

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

你的方法是正确的。但是,您在理解列表时犯了一个错误:您使用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)。在

希望这有帮助。在

相关问题 更多 >