Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.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_Image Processing_Multidimensional Array_Parallel Processing - Fatal编程技术网

Python 如何将函数并行应用于numpy阵列中的多个图像?

Python 如何将函数并行应用于numpy阵列中的多个图像?,python,numpy,image-processing,multidimensional-array,parallel-processing,Python,Numpy,Image Processing,Multidimensional Array,Parallel Processing,假设我有一个images数组,它可以容纳100000个带有3个通道的图像 images = np.random.randint(0,255,(100000,32,32,3)) 我有一个函数foo,它接受图像并对其执行一些操作 def foo(img): #some operation on the image, say histogram equalization 现在如何将foo函数并行应用于100000个图像?我以为numpy会有一些功能,但我很失望没有找到任何功能。我找到了nu

假设我有一个
images
数组,它可以容纳100000个带有3个通道的图像

images = np.random.randint(0,255,(100000,32,32,3))
我有一个函数
foo
,它接受图像并对其执行一些操作

def foo(img):
    #some operation on the image, say histogram equalization

现在如何将
foo
函数并行应用于100000个图像?我以为numpy会有一些功能,但我很失望没有找到任何功能。我找到了
numpy。沿_轴应用
,但我读到它相当重复。我该怎么办?

这里是一个例子,使用对图像执行的,在
n\u作业
等于
nproc
(这里有10个过程,但您可以根据需要进行更改)


这有帮助吗?查找sklearn大量使用的joblib,确保您了解并行编程的基础知识。根据操作的不同,某些部分可能已经是并行的(一些numpy核心函数是并行的;但不确定resize和co是否也是并行的)。看起来您正在预处理图像,然后再将其输入一些CNN。正如@sascha所提到的,
joblib
应该为您完成这项工作。我以前做过这样的项目。工作线程是否与主线程/进程共享内存空间?如果是这样,您可以在worker中使用
img[…]=equalize(img)
,这将更新中的每个图像place@Eric非常感谢你的建议!是的,它确实共享内存,但在就地更新阵列时存在两个问题。由于直方图均衡化将像素值移动到0-1范围,因此在原始数组中更新它会使所有元素都变为零,因为原始数组是integer dtype。因此,我们必须创建float32类型的原始数组,然后不需要任何更新就可以进行就地更新issues@Eric另外,请参见以下问题:
# imports
import numpy as np
from skimage import exposure
from joblib import Parallel, delayed

# number of processes
nprocs = 10

# batched image array
img_arr = np.random.randint(0, 255, (1000, 32, 32, 3))

# function to be applied on all images
def process_image(img):
     img_eq = exposure.equalize_hist(img)
     return img_eq

result = []

# run `process_image()` in parallel
result.extend(Parallel(n_jobs=nprocs)(delayed(process_image)(img_arr[idx]) for idx in range(img_arr.shape[0])))