Python 使用多处理并行化scipy.optimize.leastsq
基于,我正在尝试并行执行scipy.optimize.leastsq。xx,yy,zz是三维云点的坐标,我计算一个线点距离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
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是因为有多个参数。看起来我这边的多处理有问题。我想这意味着我不能再帮你了,这里:(