如何从时间点为numpy数组创建一个掩码?

2024-06-12 06:50:28 发布

您现在位置:Python中文网/ 问答频道 /正文

数据是一个包含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)

Tags: 数据inimportfortimenp时间dt
2条回答

不用nanmean,您只需索引所需的值并使用mean。在

means[i] = data[ (times<start) | (times>end) ].mean()

如果我误解了,你需要你的索引,你可以试试

^{pr2}$

另外,在代码中,您可能不想使用if len(spike_times) > 0(我假设您在每次迭代中删除了峰值时间,否则该语句将始终为真,您将有一个无限循环),只使用for spike_time in spike_times。在

代码中的大部分处理时间都来自以下行:

idx = np.all([times>=start,times<=end],0)

这是因为对于每个峰值,您都在比较每个值与开始和结束的时间。由于本例中的时间步长是统一的(我假设您的数据中也是如此),所以简单地计算开始和结束索引要快得多:

^{pr2}$

我的跑步时间从100秒减少到100秒。 你也可以通过在峰值时间上矢量化循环来节省更多的时间。其效果将取决于您的数据特征(对于高峰值率,应该是最有效的):

kernel = np.ones(20, dtype=bool)
for i in range(N):        
    spike_times = spiketimes[i]
    datarow = data[i]
    mask = np.zeros(len(datarow), dtype=bool)
    indexes = (spike_times / dt).astype(int)
    mask[indexes] = True  
    mask = np.convolve(mask, kernel)[10:-9]

    means[i] = datarow[~mask].mean()

相关问题 更多 >