【发布时间】:2018-01-13 13:36:18
【问题描述】:
如何通过numpy.apply_along_axis() 将函数应用于 NumPy 数组的元素,以便利用多核?这似乎是一件很自然的事情,在对正在应用的函数的所有调用都是独立的常见情况下。
在我的特殊情况下——如果这很重要——应用轴是轴 0:np.apply_along_axis(func, axis=0, arr=param_grid)(np 是 NumPy)。
我快速浏览了 Numba,但我似乎无法获得这种并行化,循环如下:
@numba.jit(parallel=True)
result = np.empty(shape=params.shape[1:])
for index in np.ndindex(*result.shape)): # All the indices of params[0,...]
result[index] = func(params[(slice(None),) + index]) # Applying func along axis 0
显然还有一个NumPy 中的编译选项用于通过 OpenMP 进行并行化,但它似乎无法通过 MacPorts 访问。
也可以考虑将数组分割成几块,然后使用线程(以避免复制数据)并在每块上并行应用函数。这比我正在寻找的更复杂(如果全局解释器锁没有被充分释放,可能无法正常工作)。
如果能够以简单的方式使用多个内核来执行简单的可并行任务,例如将函数应用于数组的所有元素(这基本上是这里需要的,函数 @ 987654327@ 采用一维参数数组。
【问题讨论】:
-
apply_along_axis是纯 Python 代码,执行您所展示的操作,除了它将感兴趣的轴移到末尾,其余部分执行ndindex(arr.shape[:-1])。替代方案已在stackoverflow.com/questions/45067268/… 等帖子中讨论过 -
由于可以将 n-d 问题重新塑造为 2d(您的兴趣轴加上其余部分),因此基本问题是 1d 列表理解。遍历行。另一个 SO 问题:stackoverflow.com/questions/44239498/…
-
我希望这些 StackOverflow 问题包含一个我可以使用的使用多个内核的解决方案!现在,我不确定 Python 列表理解如何成功地比
np.apply_along_axis()更快,但至少可以通过探索np.apply_along_axis()的简单替代方案来使单核版本更快…… -
各种 SO 已经研究过在数组的行上使用
multiprocessing.pool.map。
标签: python arrays performance numpy parallel-processing