Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用python计算Delta F/F?_Python_Numpy_Iterator - Fatal编程技术网

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

如何使用python计算Delta F/F?,python,numpy,iterator,Python,Numpy,Iterator,我最近自学了python,以便为我的实验分析数据。因此,我在很多方面都很无知。我已经设法使我的分析工作,为某些文件,但在某些情况下,它崩溃了,我想这是一个错误的编程结果 目前我导出了一个包含3个numpy数组的文件。其中一个数组是我的信号(浮点值从-10到10)。我想做的是将这个数组中的每个数据规范化为一系列值,这些值位于它之前。(即,30001值必须减去之前3000个值的平均值,然后差值必须除以相同的平均值(之前3000个值)。我的数据以100Hz的速率收集,因此为了获得alst 30s的标准

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

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

就目前情况而言,这就是我如何使其工作的:

这将信号存储到变量photosignal中

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

下面在开始处添加3000个值以保持数组的长度不变,因为稍后我必须将其时间锁定到另一个相同长度的列表中

我注意到,在某些文件中,这段代码给了我一个错误,因为它表示“切片”为空,因此无法创建平均值

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

所以我尝试了这个解决方案,但是速度很慢,而且仍然会给我“空片错误”。 我浏览了移动平均线的帖子,发现了这个方法:

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

然而,我很难将它调整到我想要的输出,即(x-运行平均值)/运行平均值

您的方法是正确的。但是,您在理解列表时犯了一个错误:您使用
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]))
请记住,python中for循环的速度相对较慢。如果性能是一个问题,您可以尝试避免for循环,而使用numpy方法(例如,查看)


希望这能有所帮助。

好吧,多亏了你的帮助和你推荐给我的帖子,我终于找到了答案

我的整个数据(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,以保持与我的photosignal相同的列表大小

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


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

谢谢,很多人都会尝试使用您提到的移动平均法!您在哪里使用
i
?您的意思是使用
i-3000:i
?@DavidCullen:您是对的..我忘了修复我打算修复的错误。。。
def running_mean(x, N):
 cumsum = np.cumsum(np.insert(x, 0, 0))
 return (cumsum[N:] - cumsum[:-N]) / N 
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]))
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)