【问题标题】:How to calculate Delta F / F using python?如何使用 python 计算 Delta F / F?
【发布时间】:2017-02-21 10:01:31
【问题描述】:

我最近“自学”了 Python,以便为我的实验分析数据。因此,我在很多方面都一无所知。我已经设法使我的分析适用于某些文件,但在某些情况下它会发生故障,我认为这是错误编程的结果。

目前我导出一个包含 3 个 numpy 数组的文件。这些数组之一是我的信号(从 -10 到 10 的浮点值)。我想做的是将这个数组中的每个数据标准化为它之前的一系列值。 (即第 30001 个值必须从中减去前 3000 个值的平均值,然后必须将差除以这个相同的平均值(前 3000 个值)。我的数据以 100Hz 的速率收集,从而获得归一化在前 30 年代,我必须使用前面的 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

我注意到,在某些文件中,这段代码给了我一个错误,因为它说“切片”是空的,因此它不能创建平均值。

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

所以我尝试了解决方案,但它很慢,但它仍然给我“空切片错误”。 我翻过移动平均线后发现了这个方法:

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

但是我无法将它适应我想要的输出。即(x-running average)/running average

【问题讨论】:

    标签: python numpy iterator


    【解决方案1】:

    好的,多亏了你的帮助和你推荐给我的帖子,我终于弄明白了。

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

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

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

    【讨论】:

      【解决方案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]))
      

      请记住,python 中的 for 循环相对较慢。如果这里的性能是一个问题,您可以尝试避免使用 for 循环并改用 numpy 方法(例如查看Moving average or running mean)。

      希望这会有所帮助。

      【讨论】:

      • 非常感谢,将与您提到的移动平均 numpy 方法一起尝试!
      • 你在哪里使用i?你的意思是使用i-3000:i
      • @DavidCullen:你说得对……我忘了修复我打算修复的错误……
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-11
      • 2016-06-21
      • 2016-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-26
      相关资源
      最近更新 更多