适配3D点Python

8

我有一段Python代码,可以生成一个由三元组(x、y和z)组成的列表。现在我想使用Scipy的curve_fit函数对z=f(x,y)进行拟合。以下是一些不起作用的代码:

A = [(19,20,24), (10,40,28), (10,50,31)]

def func(x,y,a, b):
    return x*y*a + b

如何使用Python将此函数拟合到列表A中的数据?

1个回答

16
  • func的第一个参数必须是数据(包括x和y)。
  • 其余的参数都表示参数。

因此,您需要稍微修改func

def func(data, a, b):
    return data[:,0]*data[:,1]*a + b

  • curve_fit的第一个参数是函数。
  • 第二个参数是自变量数据(以一个数组的形式表示x和y)。
  • 第三个参数是因变量数据(z)。
  • 第四个参数是参数值的猜测(在这种情况下为a和b)。

例如:

params, pcov = optimize.curve_fit(func, A[:,:2], A[:,2], guess)

import scipy.optimize as optimize
import numpy as np

A = np.array([(19,20,24), (10,40,28), (10,50,31)])

def func(data, a, b):
    return data[:,0]*data[:,1]*a + b

guess = (1,1)
params, pcov = optimize.curve_fit(func, A[:,:2], A[:,2], guess)
print(params)
# [ 0.04919355  6.67741935]

只有当x和y具有相同的维度时,此解决方案才有效。如何将此代码推广到不同形状的x、y? - TommasoF
2
答案已经适用于任意给定的x、y、z点集,因此没有形状隐含。只需打印A[:,:2]和A[:,2],即可看到第一个是(x,y)点集,第三个是数据(z)。 - roadrunner66

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接