python - numpy 中的并行数组操作

标签 python numpy parallel-processing

我有一段代码需要处理一些大的 numpy 数组。例如,我有一个 3D 数组 A,我需要使用 A 的元素构造另一个 3D 数组 B。然而,B 的所有元素都是相互独立的。示例:

for i in np.arange(Nx):
  for j in np.arange(Ny):
   for k in np.arange(Nz):
       B[i][j][k] = A[i+1][j][k]*np.sqrt(A[i][j-1][k-1])

因此,如果我可以并行构造 B 数组,速度将会大大提高。在 python 中执行此操作的最简单方法是什么?

我也有类似的矩阵运算,例如标准化二维数组的每一行。示例

for i in np.arange(Nx):
   f[i,:] = f[i,:]/np.linalg.norm(f[i,:])

如果每行并行运行,这也会加快速度。怎么办?

最佳答案

您应该查看Numpy's roll功能。我认为这相当于你的第一个代码块(尽管你需要决定边缘发生什么 - roll“环绕”):

B = np.roll(A,1,axis=0) * np.sqrt(np.roll(np.roll(A,-1,axis=1),-1,axis=2))

对于你的第二种情况,另一个相当可怕的俏皮话是:

f /= np.sqrt(np.sum(f**2, axis=1))[...,np.newaxis]

该行的解释:

我们首先要计算每一行的范数。让我们

f = np.random.rand(5,6)

f 的每个元素求平方

f**2

沿轴 1 求平方和,使该轴“变平”。

np.sum(f**2, axis=1)

取平方和的平方根。

np.sqrt(np.sum(f**2, axis=1))

现在我们有了每一行的范数。

为了正确地除以 f 的每个原始行,我们需要利用 Numpy 广播规则来有效地添加维度:

np.sqrt(np.sum(f**2, axis=1))[...,np.newaxis]

最后我们计算结果

f /= np.sqrt(np.sum(f**2, axis=1))[...,np.newaxis]

关于python - numpy 中的并行数组操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14985864/

相关文章:

python - 添加索引列并通过匹配部分索引标签来重新索引数据框

python - 获取给定整数的整个因子对列表的最简单方法是什么?

python - 与 python 并行执行代码

multithreading - 大规模多线程设计的共享内存缺陷

python - 无法修改屏蔽数组中的数据。 arr[i] 与 arr.data[i]

python - 如何始终并行运行 n 个进程,而不等待前 n 个进程完成?

用于嵌套字典对象的 Python 安全字符串模板

python - 退出 Python 进程而不是杀死它(通过 ssh)

python - 使用 matplotlib 绘制分段函数会导致 ValueError : The truth value of an array with more than one element is ambiguous

python - 比 numpy 的 in1d 掩码函数 : ordered arrays? 做得更好