使用 curve_fit 处理二维函数时,“对象对于所需数组来说太深”

问题描述 投票:0回答:1

所以我试图用多项式拟合二维函数。

我有一些数据,我已经编写了一个函数来测试它。

但是意想不到的事情发生了,比如:

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吗?

python curve-fitting
1个回答
0
投票
  • 数组 x、y、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]

© www.soinside.com 2019 - 2024. All rights reserved.