You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 01:55:02