【问题标题】:Modify 3D numpy array in slices in parallel并行修改切片中的 3D numpy 数组
【发布时间】:2018-09-01 17:07:39
【问题描述】:

我有一个复杂的 numpy 数组 signal,尺寸为 [10,1000,50000] 我需要在切片中修改这个数组。这是在 for 循环中完成的:

for k in range(signal.shape[2]):
    signal[:,:,k] = myfunction(signal[:,:,k], constant1, constant2, constant5=constant5, constant6=constant6)

我尽可能优化了myfunction。当我运行脚本时,它需要相当长的时间,但只使用了 24 个 CPU 中的 1 个。

无法重写代码以使用 numpy 对整个数组执行 myfunction。

因此,我想通过并行计算加速我的代码。 python中的并行计算似乎有很多不同的方法。 哪一个似乎最适合我的问题?我该如何实现它?

【问题讨论】:

  • 一般来说,当您使用 numpy 时,您希望避免在 python 代码中出现任何循环,而是找到正确的 numpy 函数,这些函数将一次性处理整个数组。然后由 numpy 来处理并行化。
  • 什么是myfunction
  • 如果函数的参数是从切片中计算出来的,那么你可以告诉 numpy 为每个切片执行此操作。
  • 好的,首先感谢所有反馈。我无法对整个数组执行计算来检索每个切片的参数。我需要在每个切片上独立执行 myfunction。 myfunction 太复杂了。再次感谢
  • 使用 dask。旨在并行化 numpy 操作。

标签: python parallel-processing multiprocessing


【解决方案1】:

Joblib 为此类“令人尴尬的并行”任务提供了简单的执行方式:

import numpy as np

# Initialize array and define function 
np_array = np.random.rand(100,100,100)
my_function = lambda x: x / np.sum(x)

# Option 1: Loop over array and apply function
serial_result = np_array.copy()
for i in range(np_array.shape[2]):
    serial_result[:,:,i] = my_function(np_array[:,:,i])

现在使用joblib 并行执行:

# Option 2: Parallel execution
# ... Apply function in Parallel 
from joblib import delayed, parallel
sub_arrays = Parallel(n_jobs=6)(                            # Use 6 cores 
                      delayed(my_function)(np_array[:,:,i]) # Apply my_function 
                      for i in range(np_array.shape[2]))    # For each 3rd dimension

# ... Concatenate the list of returned arrays
parallel_results = np.stack(sub_arrays, axis=2)

# Compare results 
np.equal(serial_result, parallel_results).all() # True

【讨论】:

  • 代码运行良好。但我也尝试通过访问 np_array[:,i,:,:] 将其应用于 4D 数组。但是,我在其中一个 joblib 函数中收到错误消息“输出数组是只读的”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-12
  • 1970-01-01
  • 2018-05-27
  • 2019-07-11
  • 2021-11-18
相关资源
最近更新 更多