Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python numpy中的并行阵列操作_Python_Numpy_Parallel Processing - Fatal编程技术网

Python numpy中的并行阵列操作

Python numpy中的并行阵列操作,python,numpy,parallel-processing,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中,最

我有一个代码,其中我需要处理一些大的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中,最简单的方法是什么

我也有类似的矩阵操作,比如规范化2D数组的每一行。范例

for i in np.arange(Nx):
   f[i,:] = f[i,:]/np.linalg.norm(f[i,:])
如果它为每行并行运行,也会加快速度。如何做到这一点?

您应该研究函数。我认为这相当于您的第一个代码块(尽管您需要决定在边缘发生什么-
滚动
“环绕”):

第二个案例中另一个相当可怕的一行是:

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]

如果您很好地处理了边,那么进行第一次矢量化的标准方法如下所示:

B = np.zeros(A.shape)
B[:-1, 1:, 1:] = A[1:, 1:, 1:] * np.sqrt(A[:-1, :-1, :-1])
然后需要用适当的值填充
B[-1,:,:]
B[:,0,:]
B[:,:,0]


将其扩展到其他索引应该非常简单。

要在
numpy
中执行并行处理,您应该查看。它是Python的MPI绑定。它允许分布式处理。

在实际代码中,边缘得到了很好的处理,但是
B
矩阵的构造要复杂得多,因此
numpy.roll
函数使事情变得非常混乱,容易出错。有没有一种简单的方法可以独立地运行for循环的不同迭代?容易受到编程错误或边缘处理错误的影响?编程错误。另外,我正在寻找一种通用的方法来并行化for循环的迭代,其中每个循环都是独立的。我知道,但对我来说,至少通用的方法是使用类似于
roll
的东西“排列”元素,如果变得混乱,可能会创建一些中间数组。关于并行化代码的全部选项,您应该看看
B = np.zeros(A.shape)
B[:-1, 1:, 1:] = A[1:, 1:, 1:] * np.sqrt(A[:-1, :-1, :-1])