Python 如何从numpy阵列的时间点创建掩码?

Python 如何从numpy阵列的时间点创建掩码?,python,arrays,numpy,mask,Python,Arrays,Numpy,Mask,数据是包含2500个测量时间序列的矩阵。我需要对每个时间序列进行平均,丢弃峰值周围记录的数据点(在间隔tspike dt*10…tspike+10*dt内)。每个神经元的峰值时间是可变的,存储在一个有2500个条目的字典中。我当前的代码迭代神经元和峰值时间,并将屏蔽值设置为NaN。然后调用瓶颈.nanmean()。然而,在当前版本中,这段代码会变慢,我想知道是否有更快的解决方案。谢谢 import bottleneck import numpy as np from numpy.random i

数据是包含2500个测量时间序列的矩阵。我需要对每个时间序列进行平均,丢弃峰值周围记录的数据点(在间隔tspike dt*10…tspike+10*dt内)。每个神经元的峰值时间是可变的,存储在一个有2500个条目的字典中。我当前的代码迭代神经元和峰值时间,并将屏蔽值设置为NaN。然后调用瓶颈.nanmean()。然而,在当前版本中,这段代码会变慢,我想知道是否有更快的解决方案。谢谢

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)
导入瓶颈
将numpy作为np导入
从numpy.random导入rand,randint
t=1
dt=1e-4
N=2500
dtbin=10*dt
数据=np.32(一个((N,t/dt)))
时间=np.arange(0,t,dt)
spiketimes=dict.fromkeys(名词短语arange(N))
对于钥匙插入时间:
峰值时间[key]=rand(randint(100))
平均数=np.空(N)
对于范围(N)中的i:
峰值时间=峰值时间[i]
数据行=数据[i]
如果len(峰值时间)>0:
对于spike_时间中的spike_时间:
开始=最大值(峰值时间-dtbin,0)
结束=分钟(峰值时间+dtbin,t)

idx=np.all([times>=start,times而不是使用
nanmean
您可以只索引您需要的值并使用
mean

means[i] = data[ (times<start) | (times>end) ].mean()
表示[i]=数据[(timesend)]。平均值()
如果我误解了,您确实需要索引,您可以尝试

means[i] = data[numpy.logical_not( np.all([times>=start,times<=end],0) )].mean()

表示[i]=data[numpy.logical\u not(np.all([times>=start,times 0
)(我假设您在每次迭代时删除峰值时间,否则该语句将始终为真,并且您将有一个无限循环),只对峰值时间中的峰值时间使用
代码中的绝大多数处理时间来自这一行:

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

采取的方法应该已经优化。根据瓶颈。平均值()是最快的对掩码数组进行平均的方法。我希望不经过迭代就从spiketimes字典中创建一个掩码可以带来性能上的改进performance@maryamroayaee:我认为您根本不需要使用
NaN
,也不需要使用掩码-您只需将所需的值编入索引并获取
的平均值即可-这应该是比将元素设置为NaN更快。@Maryamrayaee:我认为您的代码中也有一个错误:因为在每次迭代中将元素设置为NaN时,下一次迭代时元素不会恢复为其前NaN值!我一直在寻找对内部循环进行向量化的方法。另外,感谢您提示使用convolve创建int我的速度从几分钟加速到一秒以下
# This replaces the last loop in your example:
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
            datarow[int(start/dt):int(end/dt)] = np.NaN
    ## replaced this with equivalent for testing
    means[i] = datarow[~np.isnan(datarow)].mean()  
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()