将直方图功能扩展到重叠的箱子和具有任意间隙的箱子?
Extending histogram function to overlapping bins and bins with arbitrary gap?
是否有处理任何一般 bin 的直方图函数?
在我的神经科学应用程序中,我有两个一维数组:spikes
和 time_centers
以及一个参数 time_window
。我的目标是输出名为 firing_rate
的数组,其大小与 time_centers
相同,定义为 firing_rate[i]=len(abs(spikes-time_centers[i])<time_window)
,以便它计算每个 time_center
bin 附近的尖峰数宽度区间 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 个 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
或者,time_bins
的一个 searchsorted
在 spikes
-
的范围内
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:]
你可以利用广播:
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
是否有处理任何一般 bin 的直方图函数?
在我的神经科学应用程序中,我有两个一维数组:spikes
和 time_centers
以及一个参数 time_window
。我的目标是输出名为 firing_rate
的数组,其大小与 time_centers
相同,定义为 firing_rate[i]=len(abs(spikes-time_centers[i])<time_window)
,以便它计算每个 time_center
bin 附近的尖峰数宽度区间 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 个 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
或者,time_bins
的一个 searchsorted
在 spikes
-
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:]
你可以利用广播:
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