为何curvefit代码中*popt能使plt.plot正常运行?
参数解包的作用解释
问题背景
你编写的代码中,调用cosine(xfine, *popt)能正常运行,但去掉*写成cosine(xfine, popt)就报错:TypeError: cosine() missing 2 required positional arguments: 'b' and 'c',代码如下:
import numpy as np import matplotlib.pyplot as plt import scipy.optimize as sc fecha, temperatura = np.loadtxt('munich_temperatures_average_with_bad_data.txt', unpack=True) keep = np.abs(temperatura) < 90 fecha = fecha[keep] temperatura = temperatura[keep] def cosine(x, a, b, c): return a * np.cos(2 * np.pi * x + b) + c popt, pcov = sc.curve_fit(cosine, fecha, temperatura) plt.plot(fecha, temperatura, '.') xfine = np.linspace(1995, 2014, 100) plt.plot(xfine, cosine(xfine, *popt), color='red', lw=2)
原因分析
sc.curve_fit返回的popt是一个包含3个元素的数组,对应你定义的cosine函数里的参数a、b、c,比如popt = [a_val, b_val, c_val]。- 当你直接写
cosine(xfine, popt)时,相当于把整个数组作为第二个参数传给了a,而b和c没有传入,这就触发了参数缺失的报错。 - 而
*popt是Python的参数解包语法,它会把数组里的元素逐个拆出来,作为单独的位置参数传递给函数,等价于cosine(xfine, popt[0], popt[1], popt[2]),刚好匹配cosine(x, a, b, c)的参数要求,所以能正常运行。
内容的提问来源于stack exchange,提问作者Fcatalan
相关产品推荐
相关产品推荐

