Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.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_Parallel Processing_Multiprocessing - Fatal编程技术网

Python 并行修改切片中的三维numpy阵列

Python 并行修改切片中的三维numpy阵列,python,parallel-processing,multiprocessing,Python,Parallel Processing,Multiprocessing,我有一个复杂的numpy阵列信号,尺寸为[10100050000] 我需要分片修改这个数组。这是在for循环中完成的: for k in range(signal.shape[2]): signal[:,:,k] = myfunction(signal[:,:,k], constant1, constant2, constant5=constant5, constant6=constant6) 我尽可能地优化了我的函数。当我运行脚本时,它需要相当长的时间,但只使用24个CPU中的1个

我有一个复杂的numpy阵列信号,尺寸为[10100050000] 我需要分片修改这个数组。这是在for循环中完成的:

for k in range(signal.shape[2]):
    signal[:,:,k] = myfunction(signal[:,:,k], constant1, constant2, constant5=constant5, constant6=constant6)
我尽可能地优化了我的函数。当我运行脚本时,它需要相当长的时间,但只使用24个CPU中的1个

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

因此,我想用并行计算来加速我的代码。 python中似乎有许多不同的并行计算方法。
哪一个似乎对我的问题最好?我如何实现它呢?

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

通常,在使用numpy时,您希望避免python代码中出现任何循环,而是找到正确的numpy函数,这些函数将一次性处理整个数组。然后由numpy来处理并行化。什么是
myfunction
?如果函数的参数是从切片计算出来的,那么您可以告诉numpy对每个切片都这样做。好的,伙计们,首先感谢所有的反馈。我无法对整个阵列执行计算以检索每个切片的参数。我需要在每个片上独立地执行myfunction。myfunction太复杂了。再次谢谢你。设计用于并行numpy操作。代码运行良好。但我也试图通过访问np_数组[:,I,:,:],将其应用于4D数组。但是,我在一个joblib函数中收到错误消息“output array是只读的”