Python 使用多处理并行化scipy.optimize.leastsq

Python 使用多处理并行化scipy.optimize.leastsq,python,parallel-processing,scipy,python-multiprocessing,Python,Parallel Processing,Scipy,Python Multiprocessing,基于,我正在尝试并行执行scipy.optimize.leastsq。xx,yy,zz是三维云点的坐标,我计算一个线点距离 import multiprocessing import numpy as np from scipy.optimize import leastsq p = [55, 0, 55, 0] xx=np.array([ 54.696, 54.272, 54.272, 53.424, 53.424, 53.424, 53.848, 53.424, 53.84

基于,我正在尝试并行执行scipy.optimize.leastsq。xx,yy,zz是三维云点的坐标,我计算一个线点距离

import multiprocessing
import numpy as np
from scipy.optimize import leastsq

p = [55, 0, 55, 0]

xx=np.array([ 54.696,  54.272,  54.272,  53.424,  53.424,  53.424,  53.848,
53.424,  53.848,  53.424,  53.424,  53.424,  53.848,  53.848,
53.848,  53.424,  53.424,  53.424,  53.424,  53.424,  53.848,
53.848,  53.424,  53.424,  53.848,  53.848,  53.424,  53.848,
53.424])
yy=np.array([ 53.848,  53.424,  53.848,  53.424,  53.848,  53.848,  53.848,
53.848,  53.848,  52.576,  53.424,  53.848,  52.576,  53.424,
53.848,  52.576,  53.424,  53.848,  52.576,  53.848,  52.576,
53.848,  52.576,  53.848,  52.576,  53.848,  52.576,  52.576,
52.576])
zz=np.array([ 4.936 ,  5.4296,  5.4296,  5.9232,  5.9232,  6.4168,  6.4168,
6.9104,  6.9104,  7.404 ,  7.404 ,  7.404 ,  7.404 ,  7.404 ,
7.404 ,  7.8976,  7.8976,  7.8976,  8.3912,  8.3912,  8.3912,
8.3912,  8.8848,  8.8848,  8.8848,  8.8848,  9.3784,  9.3784,
9.872 ])


def fun(p,xx,yy,zz):
    distance=[]    
    v0 = np.array([p[0], p[2], 0]); v1 = np.array([p[1],p[3], 1])
    def funA(v0,v1,xx,yy,zz):        
        for point in range(len(xx)):
            pp = np.array([xx[point], yy[point], zz[point]])
            yield pp,v0,v1
    pool = multiprocessing.Pool()
    distance.append(pool.starmap(funB, funA(v0,v1,xx,yy,zz)))
    return distance

def funB(pp, v0,v1):
        RunDistance=(np.linalg.norm(np.cross(pp-v0,v1))/np.linalg.norm(v1))
        return RunDistance

result,cov,infodict,mesg,ier = leastsq(fun,p, args=(xx,yy,zz), Dfun=None, full_output=True, col_deriv=0, ftol=1.49012e-08, xtol=1.49012e-08, gtol=0.0, epsfcn=None, factor=100, diag=None)
---我得到的错误是:

TypeError回溯(最近一次调用上次) 在() 37回跑道 38 --->39结果,cov,infodict,mesg,ier=leastsq(乐趣,p,参数=(xx,yy,zz),Dfun=None,全输出=True,col=0,ftol=1.49012e-08,xtol=1.49012e-08,gtol=0.0,epsfcn=None,因子=100,诊断=None)

/usr/local/lib/python3.6/site-packages/scipy/optimize/minpack.py(func,x0,args,Dfun,full_输出,col_deriv,ftol,xtol,gtol,maxfev,epsfcn,factor,diag) 378米=形状[0] 379如果n>m: -->380 raise TypeError('不正确的输入:N=%s不能超过M=%s'(N,M)) 381如果epsfcn为无: 382 epsfcn=finfo(dtype).eps

类型错误:输入不正确:N=4不得超过M=1


无需多重处理的函数

def fun(p,xx,yy,zz):
    distance=[] #distance initialized
    v0 = np.array([p[0], p[2], 0]); v1 = np.array([p[1],p[3], 1]) #3D line parametric equation

    for point in range(len(xx)): #for loop over all the x/y positions inside track   
        pp = np.array([xx[point], yy[point], zz[point]]) # 1 3D point
        distance.append((np.linalg.norm(np.cross(pp-v0,v1))/np.linalg.norm(v1))) #* fxfy   #check references at bottom of file for equation explanation   

    return distance 

为了回答我自己的问题,这个示例创建了一个嵌套列表,因此len(distance)=1。通过放置:

return distance[0]
现在的错误是OSError:[Errno 24]打开的文件太多

通过从此处更改/Library/LaunchDaemons/limit.maxfiles.plist也可以解决此问题:


当前错误:

---> 67         self.pid = os.fork()
     68         if self.pid == 0:
     69             try:

BlockingIOError: [Errno 35] Resource temporarily unavailable

错误发生在哪里(堆栈跟踪)?请同时添加玩具数据,以便运行您的代码并重现问题。已编辑…………嗯。。我没有收到错误,但是调用
fun(p,xx,yy,zz)
似乎没有返回。如果您不使用多处理池,那么对
starmap
的等效调用是什么呢?我已经进行了进一步的编辑,以包含导入,并修复了一个bug,从而使示例能够正常工作。仍然得到相同的错误。添加了无需多处理的有趣功能。在使用原始示例map时,我使用starmap是因为有多个参数。看起来我这边的多处理有问题。我想这意味着我不能再帮你了,这里:(