【问题标题】:Extending histogram function to overlapping bins and bins with arbitrary gap?将直方图函数扩展到具有任意间隙的重叠箱和箱?
【发布时间】:2019-08-23 18:36:46
【问题描述】:

是否有处理任何一般 bin 的直方图函数?

在我的神经科学应用程序中,我有两个一维数组:spikestime_centers 以及一个参数 time_window。我的目标是输出名为firing_rate 的数组,其大小与time_centers 相同,定义为firing_rate[i]=len(abs(spikes-time_centers[i])<time_window),以便计算宽度time_window 区间内每个time_center bin 附近的尖峰数。

我很快起草了一个函数,但我有点担心性能,因为我需要处理大量的脉冲序列。

def fr(spikes,time_bins,time_window):
    rate=np.zeros(time_bins.size)
    for i,t in enumerate(time_bins):
        rate[i]= sum(np.abs(spikes-t)<time_window)
    return rate

是否可以利用spikes 数组已排序的事实? 即使我使用相同大小的垃圾箱 (time_window),我的垃圾箱也可能重叠,或者垃圾箱之间可能存在可变间隙。

通常spikes 包含 ~ 1000 个元素,time_centers ~ 50 个 bin,我需要为每个会话计算 30000 个神经元。

【问题讨论】:

  • 考虑接受最适合您的那个?
  • @Divakar 是的,我通常会等一两天

标签: python numpy neuroscience


【解决方案1】:

我们可以使用np.searchsorted的排序性质-

idx1 = np.searchsorted(spikes,time_bins-time_window,'right')
idx2 = np.searchsorted(spikes,time_bins+time_window,'left')
rate = idx2-idx1

或者,time_bins 的一个searchsortedspikes 的范围内-

T = np.r_[time_bins-time_window,time_bins+time_window]
n = len(time_bins)
idxx = np.searchsorted(spikes,T,'left')
idx1 = idxx[:n] + (time_bins-spikes[idxx[:n]]>=time_window)
idx2 = idxx[n:]

【讨论】:

  • @MikhailGenkin 用一个搜索排序来查看替代方案。使用较小的 time_bins 数组在您的用例中应该会更好。
  • 谢谢!第一种方法比我的 for 循环草稿快 1000 倍。您的第二种方法似乎比第一种方法慢两倍
【解决方案2】:

你可以利用广播:

def fr(spikes, time_bins, time_window):
    spikes = spikes.reshape((-1, 1))
    time_bins = time_bins.reshape((1, -1))
    rate = np.sum(np.abs(spikes - time_bins) < time_window, axis=0)
    return rate

【讨论】:

  • 谢谢,也是一种非常快速且透明的方式
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-21
  • 2014-02-21
相关资源
最近更新 更多