数据是一个包含2500个测量时间序列的矩阵。我需要平均每个时间序列随时间的平均值,丢弃在峰值附近记录的数据点(在间隔tspike dt*10。。。t派克+10*dt)。每个神经元的峰值时间是可变的,并存储在一个有2500个词条的字典中。我当前的代码迭代神经元和峰值时间,并将掩码值设置为NaN。那么瓶颈。南美()被调用。然而,这段代码在当前版本中会变慢,我想知道有没有更快的解决方案。谢谢!在
import bottleneck
import numpy as np
from numpy.random import rand, randint
t = 1
dt = 1e-4
N = 2500
dtbin = 10*dt
data = np.float32(ones((N, t/dt)))
times = np.arange(0,t,dt)
spiketimes = dict.fromkeys(np.arange(N))
for key in spiketimes:
spiketimes[key] = rand(randint(100))
means = np.empty(N)
for i in range(N):
spike_times = spiketimes[i]
datarow = data[i]
if len(spike_times) > 0:
for spike_time in spike_times:
start=max(spike_time-dtbin,0)
end=min(spike_time+dtbin,t)
idx = np.all([times>=start,times<=end],0)
datarow[idx] = np.NaN
means[i] = bottleneck.nanmean(datarow)
不用
nanmean
,您只需索引所需的值并使用mean
。在如果我误解了,你需要你的索引,你可以试试
^{pr2}$另外,在代码中,您可能不想使用
if len(spike_times) > 0
(我假设您在每次迭代中删除了峰值时间,否则该语句将始终为真,您将有一个无限循环),只使用for spike_time in spike_times
。在代码中的大部分处理时间都来自以下行:
这是因为对于每个峰值,您都在比较每个值与开始和结束的时间。由于本例中的时间步长是统一的(我假设您的数据中也是如此),所以简单地计算开始和结束索引要快得多:
^{pr2}$我的跑步时间从100秒减少到100秒。 你也可以通过在峰值时间上矢量化循环来节省更多的时间。其效果将取决于您的数据特征(对于高峰值率,应该是最有效的):
相关问题 更多 >
编程相关推荐