【问题标题】:faster nested for loops for all pair of rows in a numpy arraynumpy 数组中所有行的嵌套循环更快
【发布时间】: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


【解决方案1】:
complex_phase_diff = np.abs(np.nansum(np.exp(np.complex(0,1) * np.subtract.outer(x[a], x[b])), axis=1)) / x.shape[1]

【讨论】:

  • 抛出内存错误
  • @deathracer 对于初始代码使用的内存量,这并不奇怪也会抛出内存错误在任何主流机器上。您没有提供有关运行环境的信息,因此他们无法知道这是否符合您的需求...
猜你喜欢
  • 1970-01-01
  • 2016-10-08
  • 2021-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-19
  • 1970-01-01
  • 2021-09-03
相关资源
最近更新 更多