是否有一个直方图函数可以处理任何常规垃圾箱?

在我的神经科学应用程序中,我有两个一维数组:spikestime_centers和一个参数time_window。我的目标是输出名为firing_rate的数组,该数组的大小与time_centers相同,定义为firing_rate[i]=len(abs(spikes-time_centers[i])<time_window),以便它计算宽度为time_center的间隔中每个time_window 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个神经元。

最佳答案

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

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


另外,对于searchsorted,一个time_binsspikes的范围内-

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:]

关于python - 将直方图功能扩展到重叠的容器和具有任意间隙的容器?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57631469/

10-12 18:27