2012-03-26 28 views
0

私は、データのセットに最適なポイントを見つける方法としてscipy.leastsq()を使用しようとしています。 scipyライブラリに慣れていないので、leastsq関数はデータの集合全体を一度に計算するという印象を受けますが、データポイントをスカラとして取っているように見えるので、同時に問題があります。SciPy LeastSq - スカラ問題への配列

私の目標は、結果を一連のサークルとの最小距離を持つ点(x、y)という2つの値のセットとして取得することです。この値は、xの形式でleastsq関数にも与えられます、y、半径)。 leastsq関数の前半の数学は、推測に最も近い各円上の点を見つけ、その点からその点までの距離を取得します。 (、半径は既に配列に値がロードされているXI、YI)leastsq機能へ

コール

#Now that we have the center, we can do least squares 
#generate point guess starting at avg of circles 
ptGuess = np.array([avgX,avgY])   
point, cov,info,mesg, ier = optimize.leastsq(calcResiduals, ptGuess, args = (xi,yi,radii)) 

とcalcResiduals():

def calcResiduals(ptGuess, xi, yi, radii): 
#extract x and y from guess point 
xg = ptGuess[0] 
yg = ptGuess[1] 
#slope of the line from (xi,yi) to guess (xg,yg) 
m = (yg - yi)/(xg - xi) 
#Go along the line for the distance of c to get coordinates 
deltax = radii/math.sqrt(1+m**2) 
if (xi > xg): 
    xii = xi + deltax 
else: 
    xii = xi - deltax 
yii = m*(xii-xi) + yi 
#residuals is distance from (xii,yii) to (xg, yg) 
return (xii-xg)**2 + (yii-yg)**2  

私が手にエラーがほのめかしているようです配列を乗算のスカラー値に変換する際の問題ではありますが、なぜその行はまだ動作しないのか分かりません。

エラー:

File "listener.py", line 62, in calcAPLocation 
point, cov,info,mesg, ier = optimize.leastsq(calcResiduals, ptGuess, args = (xi,yi,radii)) 
File "/usr/lib/python2.7/dist-packages/scipy/optimize/minpack.py", line 276, in leastsq 
m = _check_func('leastsq', 'func', func, x0, args, n)[0] 
File "/usr/lib/python2.7/dist-packages/scipy/optimize/minpack.py", line 13, in _check_func 
res = atleast_1d(thefunc(*((x0[:numinputs],) + args))) 
File "listener.py", line 76, in calcResiduals 
deltax = radii/math.sqrt(1+m**2) 
TypeError: only length-1 arrays can be converted to Python scalars 

答えて

2

コード内xiとyiのポイントの配列である場合、mはLEN(XI)に 等しい長さを持つ配列であるべきです。関数math.sqrtは、長さが1の配列またはスカラーが必要です。

前の行:あなたは、同じ長さの配列に分割しているので

m = (yg - yi)/(xg - xi) 

作品。

この行は失敗します。

deltax = radii/math.sqrt(1+m**2) 

メートルは多くのエントリを持つ配列で、Pythonの数学ライブラリは、それを処理する方法を知らないので。 math.sqrtをnumpy.sqrtに変更して、それぞれの エントリの平方根をmで試すことができます。私はこれがあなたの後であると思います。上記の行を

deltaX = radii/np.sqrt(1 + m**2) 
に変更してください