所以我试图用多项式拟合二维函数。
我有一些数据,我已经编写了一个函数来测试它。
但是意想不到的事情发生了,比如:
ValueError:对象对于所需数组来说太深
错误:函数调用的结果不是正确的浮点数组。
然后我上网但没有发现任何像我的情况。我不知道如何扁平化我的数据。我应该怎么做才能解决这个问题?
(这是我的代码:
def 聚(阶数,cov,x):
z = 0
for r in range(order + 1):
for k in range(order + 1):
z += cov[r * order + k] * x[0] ** r * x[1] ** k
return z
def polynomial_func(x , *cov):
order = int(np.sqrt(len(cov))) - 1
return poly(order, cov, x)
k = int(input('请输入订单:'))
U = 排序(列表(u))
V = 排序(列表(v))[300:501]
U = U*201
V0 = []
对于 V 中的项目:
V0 = V0 + [item]*151
V = V0
arr_x = np.array(U[::3])
arr_y = np.array(V[::3])
arr_z = g(arr_x,arr_y)
popt, pcov = curve_fit(polynomial_func, (arr_x,arr_y), arr_z , p0=[0.0] * (k+1)**2)
打印(np.round(popt,2))
其中 u 和 v 是一些随机 x y,g 是插值生成的函数)
我浏览过网络。 这个问题似乎通常是由于二维数组造成的,但我不知道如何处理它们。
出现这种情况是因为arr_z吗?
curve_fit()
需要一维数组。flatten()
:import numpy as np
from scipy.optimize import curve_fit
def g(x, y):
return x + y
def poly(order, cov, x):
z = 0
for r in range(order + 1):
for k in range(order + 1):
z += cov[r * (order + 1) + k] * x[0] ** r * x[1] ** k
return z
def polynomial_func(xy, *cov):
order = int(np.sqrt(len(cov))) - 1
x, y = xy[0], xy[1]
z = np.zeros_like(x)
for i in range(len(x)):
z[i] = poly(order, cov, (x[i], y[i]))
return z
np.random.seed(1)
u, v = np.random.rand(1000), np.random.rand(1000)
k = 2
U, V = sorted(list(u)), sorted(list(v))[300:501]
min_len = min(len(U), len(V))
U, V = U[:min_len], V[:min_len]
U = U * (201 // min_len)
V0 = []
for item in V:
V0 += [item] * 151
V = V0
min_len = min(len(U), len(V))
U, V = U[:min_len], V[:min_len]
arr_x, arr_y = np.array(U[::3]), np.array(V[::3])
min_len = min(len(arr_x), len(arr_y))
arr_x, arr_y = arr_x[:min_len], arr_y[:min_len]
arr_z = g(arr_x, arr_y)
arr_x, arr_y, arr_z = arr_x.flatten(), arr_y.flatten(), arr_z.flatten()
xy = np.vstack((arr_x, arr_y))
popt, pcov = curve_fit(polynomial_func, xy, arr_z, p0=[0.0] * (k + 1) ** 2)
print(np.round(popt, 2))
[ 0.24 -0.57 2.52 0.97 0.18 -0.29 -0.01 0.08 -0.13]