【发布时间】:2023-02-08 04:49:22
【问题描述】:
我有一个 numpy 数组,它基本上是以 1000 Hz 采样一个小时的 256 个通道记录的振荡相位。结果,我得到了一个大小为 256 x 5000000 的 numpy 数组。我想计算所有通道对(行)的Phase locking value。锁相值是衡量振荡耦合程度的指标。这是一种可行的方法,但显然很耗时。我有 128Gb RAM 可用。
x = np.array([]) # 256 x 5000000
Nchans = 256
op = []
for a in range(Nchans):
for b in range(Nchans):
phasediff = np.abs(np.nansum(np.exp(np.complex(0,1)*(x[a] - x[b]))))/x.shape[1]
op.append(phasediff)
有什么办法可以加快计算速度吗?
【问题讨论】:
-
您能否详细说明您要计算的结果是什么?如所写,优化此方法的最佳方法是跳过循环并仅计算最后一次迭代,因为每隔一次迭代都会被丢弃:
complex_phase_diff = np.abs(np.nansum(np.exp(np.complex(0,1)*(x[255] - x[255]))))/x.shape[1] -
对不起。将我的更改添加到脚本中。我需要所有的 phasediff 计算在行的所有组合上运行
-
你真的需要在 Python 中创建包含 1_280_000_000 个项目的列表?这似乎根本不合理,尤其是因为每个项目都是一个 Python 对象,需要分配、释放、引用计数并且至少占用 32 个字节,更不用说列表中通常为 8 个字节的引用。最后你需要至少 47.7 GiB 的 RAM(乐观的下限)......将它存储在 Numpy 数组中更好(19 GiB)但对于 Python 脚本来说仍然不太合理......不存储
op当然是个好主意。这意味着您仍然需要告诉我们更多关于用例的信息。
标签: python numpy for-loop signal-processing