我最近"教过"我自己用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-运行平均值)/运行平均值
答案 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信号。再次感谢您的反馈,真的很有帮助!