如何在python 3中接收tuple作为函数的参数



我有一些代码在python2中运行良好。我需要把它翻译成python3。其中有一部分我不明白如何适应。

这是一些代码。

有错误的功能

def gauss((x, y), x0, y0, intens, sigma):
return intens*numpy.exp(-(numpy.power(x-x0, 2)+numpy.power(y-y0, 2))/(2.*sigma**2)).ravel()

呼叫者功能

def dofwhm(psfdata):
x = numpy.arange(psfdata.shape[1])
y = numpy.arange(psfdata.shape[0])
x, y = numpy.meshgrid(x, y)
popt, pcov = opt.curve_fit(gauss, (x, y), psfdata.ravel(), p0=[psfdata.shape[1]/2, psfdata.shape[0]/2, psfdata[psfdata.shape[1]/2, psfdata.shape[0]/2], 5.0])
return 2.355*abs(popt[3])

我得到的错误是

Traceback (most recent call last):
File "catalog.py", line 8, in <module>
import cutPsf
File "/Users/igor/GALPHAT/pypygalphat/preprocessingNew/cutPsf.py", line 9
def gauss((x, y), x0, y0, intens, sigma):
^
SyntaxError: invalid syntax

有人能帮我怎么适应蟒蛇吗?

更新:嗯,@hpaulj的回答似乎是对的。我发现有一个例程可以将Python2代码转换为Python3代码。因此,在目标文件2to3-w cutPsf.py上运行后,我从hpaulj获得了建议的解决方案。不幸的是,它导致了闲置错误:

Traceback (most recent call last):
File "catalog.py", line 323, in <module>
cutPsf.run(tempDir+galaxy.psffile, outDirFits+galaxy.psffile)
File "/Users/igor/GALPHAT/pypygalphat_p3/preprocessingNew/cutPsf.py", line 63, in run
coeffwhm = dofwhm(newPsf)
File "/Users/igor/GALPHAT/pypygalphat_p3/preprocessingNew/cutPsf.py", line 20, in dofwhm
psfdata.shape[1]/2, psfdata.shape[0]/2, psfdata[psfdata.shape[1]/2, psfdata.shape[0]/2], 5.0])
IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices

如前所述,使用Python2…,一切都能完美运行

稍后打开

def gauss(xy, x0, y0, intens, sigma):
x, y = xy
return intens*numpy.exp(-(numpy.power(x-x0, 2)+numpy.power(y-y0, 2))/(2.*sigma**2)).ravel()

我基于典型的scipy优化需求提出了这一点,其中用户定义的函数用f(x, *args)调用,其中x是优化的变量(可能是数组(。但curve_fit不同。

scipy.optimize.curve_fit(f, xdata, ydata, p0=None,...)

f(您的gauss?(满足以下条件:

ydata = f(xdata, *params) + eps 

https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.curve_fit.html

如果xdata(x,y)元组,或者是由它组成的数组,我想我的建议仍然有效。而CCD_ 9就是CCD_。

您需要使用*运算符进行一些修改。

def gauss(x, y, x0, y0, intens, sigma):
return intens*numpy.exp(-(numpy.power(x-x0, 2)+numpy.power(y-y0, 2))/(2.*sigma**2)).ravel()
def dofwhm(psfdata):
x = numpy.arange(psfdata.shape[1])
y = numpy.arange(psfdata.shape[0])
x, y = numpy.meshgrid(x, y)
popt, pcov = opt.curve_fit(gauss, *(x, y), psfdata.ravel(), p0=[psfdata.shape[1]/2, psfdata.shape[0]/2, psfdata[psfdata.shape[1]/2, psfdata.shape[0]/2], 5.0])
return 2.355*abs(popt[3])

相关内容

  • 没有找到相关文章

最新更新