- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想计算事件/刺激触发的平均计算效率。假设我有一个 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
一旦我获得了所有这些信号 block ,我想对它们进行平均。在过去我会创建信号的时间向量
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)
我会将信号 block 保存在列表
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
是保存这些 block 的最佳数据结构吗?您知道如何更快地获取数据 block 吗?也许使用缓冲区?预先感谢您的意见和建议。
最小工作示例
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)
最佳答案
由于您的信号是在规则网格上定义的,因此您可以进行一些算术运算来找到所需所有样本的索引。然后,您可以使用单个索引操作构造包含 block 的数组。
import numpy as np
# Making some test data
n_signal = 1000
signal = np.random.rand(n_signal)
Fs = 25000 # Hz
t_events = np.array([0.01, 0.017, 0.018, 0.022, 0.034, 0.0345, 0.03456])
# Preferences
t_bef = 0.001
t_aft = 0.002
# The number of samples in a chunk
nsamples = int((t_bef+t_aft) * Fs)
# Create a vector from 0 up to nsamples
sample_idx = np.arange(nsamples)
# Calculate the index of the first sample for each chunk
# Require integers, because it will be used for indexing
start_idx = ((t_events - t_bef) * Fs).astype(int)
# Use broadcasting to create an array with indices
# Each row contains consecutive indices for each chunk
idx = start_idx[:, None] + sample_idx[None, :]
# Get all the chunks using fancy indexing
signal_chunks = signal[idx]
# Calculate the average like you did earlier
event_triggered_average = signal_chunks.mean(axis=0)
请注意,带有 .astype(int)
的行不会四舍五入到最接近的整数,而是四舍五入到零。
关于python - 在 Python 中有效地计算事件/刺激触发的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23950762/
你好呀,我是歪歪。 给大家分享一个关于 ScheduledExecutorService 线程池的 BUG 啊,这个 BUG 能直接把 CPU 给飚到 100%,希望大家永远踩不到。
我在 python 2.7 中使用 spur,通过 ssh 连接到 linux box,但由于某种原因,它弄乱了我的文件路径。这是命令: import spur outFile = "'%s'" %
我是 StimulusJS 的新手,我只想在用户添加新帖子时显示附加在其他帖子后面的帖子内容。一切似乎都正常,但帖子被附加了两次,因此看起来表单已提交了两次。
我是 StimulusJS 的新手,我只想在用户添加新帖子时显示附加在其他帖子后面的帖子内容。一切似乎都正常,但帖子被附加了两次,因此看起来表单已提交了两次。
我有一个项目列表,每个项目都有一个链接可以单击以对其进行编辑。当他们单击该编辑链接时,我正在使用刺激使编辑“模态”表单可见。将要编辑的内容的 id 以 id= 的形式出现在列表的相应链接标签上 因此,
我的 HTML 页面上有以下 Controller : ... ... 此子 Controller 映射到以下 c
我的 HTML 页面上有以下 Controller : ... ... 此子 Controller 映射到以下 c
我是一名优秀的程序员,十分优秀!