
###前提・実現したいこと
Python3とscipy.optimize.curve_fitを用いて二次元画像データからガウシアンフィッティングを行いたいのですが,
Result from function call is not a proper array of floats.
のエラーメッセージの対処がわからず困っています。
対処法をお教えくださると幸いです。
###該当のソースコード
Python
1import numpy as np 2from PIL import Image as pil 3import matplotlib.pyplot as plt 4from scipy.optimize import curve_fit 5 6data = np.array(pil.open("figs/image.png")) 7data = data/np.max(data) 8 9x,y=np.meshgrid(np.linspace(0,data.shape[1],data.shape[1]),np.linspace(0,data.shape[0],data.shape[0])) 10 11def twoDgaussian(X,wx,wy,x0,y0): 12 x,y=X 13 z=np.exp(-(x-x0)**2/wx**2-(y-y0)**2/wy**2) 14 return z 15 16initial=(50,50,500,500) 17 18popt,pcov=curve_fit(twoDgaussian,(x,y),data,initial)
###発生している問題・エラーメッセージ
------------------------------------------------------------------------- ValueError Traceback (most recent call last) ValueError: object too deep for desired array ------------------------------------------------------------------------- error Traceback (most recent call last) <ipython-input-133-8afc316156ee> in <module>() ----> 1 popt,pcov=curve_fit(twoDgaussian,(x,y),data,initial) C:\Users\***\Anaconda3\lib\site-packages\scipy\optimize\minpack.py in curve_fit(f, xdata, ydata, p0, sigma, absolute_sigma, check_finite, bounds, method, jac, **kwargs) 734 # Remove full_output from kwargs, otherwise we're passing it in twice. 735 return_full = kwargs.pop('full_output', False) --> 736 res = leastsq(func, p0, Dfun=jac, full_output=1, **kwargs) 737 popt, pcov, infodict, errmsg, ier = res 738 cost = np.sum(infodict['fvec'] ** 2) C:\Users\***\Anaconda3\lib\site-packages\scipy\optimize\minpack.py in leastsq(func, x0, args, Dfun, full_output, col_deriv, ftol, xtol, gtol, maxfev, epsfcn, factor, diag) 385 maxfev = 200*(n + 1) 386 retval = _minpack._lmdif(func, x0, args, full_output, ftol, xtol, --> 387 gtol, maxfev, epsfcn, factor, diag) 388 else: 389 if col_deriv: error: Result from function call is not a proper array of floats.
###追加点
def twoDgaussian(X,wx,wy,x0,y0): x,y=X z=np.exp(-(x-x0)**2/wx**2-(y-y0)**2/wy**2) return z.ravel() initial=(50,50,500,500) data_ravel=data.ravel() popt,pcov=curve_fit(twoDgaussian,(x,y),data_ravel,initial)
とすることで通るようになったものの、出力結果が
popt=array([ 1.05774768e+00, 1.23219802e-02, 5.00141975e+02, 5.00041068e+02])
でwxとwyは同程度のはずなのでまだおかしい。

どの変数が適切なfloatになっていないか呈示できそうでしょうか?何行目の何がどうこう、というエラーメッセージが表示されていなさそうという理由です。
すみません。表示されているメッセージとしては他にないのではっきりとわからないのですが、関数twoDgaussianの出力のことを指していると思います。ただ、この関数の出力は確認するとfloatのarrayになっているようでした。

Q.1 curve_fit(以下略)で twoDgaussian(X,wx,wy,x0,y0) を呼び出す際に、twoDgaussian()の引数が省略されているのはこれで大丈夫でしょうか?
Q.2 差し支えなければimage.pngをアップロードしてください
アップロードしました。引数の省略ですが、チュートリアルなどでも省略しているのと、一変数関数のフィッティングを試してみて問題なく通ったことからそこは問題ないと思います。第一引数を独立変数として扱ってそれ以外はパラメータとして扱われるようです。
回答1件
あなたの回答
tips
プレビュー