2

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

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

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

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 个箱,我需要为每个会话计算 30000 个神经元。

4

2 回答 2

1

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

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

或者,其中一个searchsortedtime_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:]
于 2019-08-23T19:23:52.893 回答
1

你可以利用广播:

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
于 2019-08-23T19:35:10.507 回答