【发布时间】:2014-05-30 09:01:47
【问题描述】:
我想以计算效率高的方式计算事件/刺激触发的平均值。
假设我有一个signal,例如
signal = [random.random() for i in xrange(0, 1000)]
使用n_signal 数据点
n_signal = len(signal)
我知道这个信号的采样率是
Fs = 25000 # Hz
在这种情况下我知道信号的总时间
T_sec = n_signal / float(Fs)
在特定时间,某些事件会发生,例如
t_events = [0.01, 0.017, 0.018, 0.022, 0.034, 0.0345, 0.03456]
现在我想找到这些事件之前某个时间的信号,例如
t_bef = 0.001
直到这些事件之后的某个时间,例如
t_aft = 0.002
一旦我得到了所有这些信号块,我想对它们进行平均。 过去我会创建信号的时间向量
t_signal = numpy.linspace(0, T_sec, n_signal)
并在t_signal 中查找t_events 的所有索引,例如使用numpy.serachsorted
(Link)
由于我知道信号的采样率,这些可以更快地完成,比如
indices = [int(i * Fs) for i in t_events]
这为我节省了t_signal 的内存,我不必通过整个信号来查找我的索引。
接下来,我会确定t_bef和t_aft对应的数据样本有多少
nsamples_t_bef = int(t_bef * Fs)
nsamples_t_aft = int(t_aft * Fs)
我会将信号块保存在list
signal_chunks = list()
for i in xrange(0, len(t_events)):
signal_chunks.append(signal[indices[i] - nsamples_t_bef : indices[i] + nsamples_t_aft])
最后我将这些取平均值
event_triggered_average = numpy.mean(signal_chunks, axis = 0)
如果我对时间向量感兴趣,我正在计算它
t_event_triggered_average = numpy.linspace(-t_signal[nsamples_t_bef], t_signal[nsamples_t_aft], nsamples_t_bef + nsamples_t_aft)
现在我的问题是:有没有一种计算更有效的方法来做到这一点?如果我有一个包含许多数据点和许多事件的信号,则此计算可能需要一段时间。 list 是保存这些块的最佳数据结构吗?您知道如何更快地获取数据块吗?也许使用缓冲区?
提前感谢您的 cmets 和建议。
最小工作示例
import numpy
import random
random.seed(0)
signal = [random.random() for i in xrange(0, 1000)]
# sampling rate
Fs = 25000 # Hz
# total time of the signal
n_signal = len(signal)
T_sec = n_signal / float(Fs)
# time of events of interest
t_events = [0.01, 0.017, 0.018, 0.022, 0.034, 0.0345, 0.03456]
# and their corresponding indices
indices = [int(i * Fs) for i in t_events]
# define the time window of interest around each event
t_bef = 0.001
t_aft = 0.002
# and the corresponding index offset
nsamples_t_bef = int(t_bef * Fs)
nsamples_t_aft = int(t_aft * Fs)
# vector of signal times
t_signal = numpy.linspace(0, T_sec, n_signal)
signal_chunks = list()
for i in xrange(0, len(t_events)):
signal_chunks.append(signal[indices[i] - nsamples_t_bef : indices[i] + nsamples_t_aft])
# average signal value across chunks
event_triggered_average = numpy.mean(signal_chunks, axis = 0)
# not sure what's going on here
t_event_triggered_average = numpy.linspace(-t_signal[nsamples_t_bef],
t_signal[nsamples_t_aft],
nsamples_t_bef + nsamples_t_aft)
【问题讨论】:
-
我已经编辑了您的问题,以便您拥有代码的最低工作示例。这应该有望帮助那些正在研究这个问题的人。如果我误解了任何内容,请随时编辑代码/cmets。
-
@Mr E:谢谢,这是个好主意。下次我发布一些东西时,我会提醒自己使用一个最小的工作示例。
标签: python numpy signal-processing average performance