簡體   English   中英

平行修改切片中的3D numpy數組

[英]Modify 3D numpy array in slices in parallel

我有一個復雜的numpy數組信號 ,尺寸為[10,1000,50000]我需要在切片中修改這個數組。 這是在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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM