Scipy的带有矩阵或数组的curve_fit作为初始猜测

时间:2019-07-11 16:00:47

标签: python

这是一个最小的工作示例:

x_data = np.linspace(-5, 5, num=50)
y_data = 2.9 * np.sin(1.5 * x_data) + np.random.normal(size=50)

def test_func(x, *c):
    a = c[0][0]
    b = c[0][1]
    return a * np.sin(b * x)

p0 = np.array([[2,2],[2,2]])

params, params_covariance = curve_fit(test_func, x_data, y_data, p0)

print(params)

这将返回

IndexError: invalid index to scalar variable.

我认为问题在于p0是一个矩阵,而curve_fit很难将其作为第一次猜测。有办法使它起作用吗?

PS:我知道,在上面的示例中,p0不必是矩阵,我可以将函数定义为test_func(x, a, b)并用作第一个猜测{ {1}}。但是,上面的示例只是我的代码的简化,在我的代码中,我确实需要第一个猜测p0=[2,2]作为矩阵。

2 个答案:

答案 0 :(得分:0)

只需将其作为普通参数传递,并使用索引选择值即可。

def f(m):
   print(m[0,0]) # --> 0
   print(m[0,1]) # --> 1
   print(m[1,0]) # --> 2
   print(m[1,1]) # --> 3

params = np.array([[0,1],[2,3]])
f(params)

或者如果您不知道数组的大小:

def f(m):
    for i in range(m.shape[0]):
        for j in range(m.shape[1]):
            print(m[i,j])

答案 1 :(得分:0)

这是访问和更改numpy数组中某些元素的函数的小示例:

import numpy as np

params = np.array([[0,1],[2,3]])


def fn(a):
    print(a[0][0])
    a[0][0] = 5

fn(params)

print(params[0][0])

注意:我们在这里不使用*来表示对params的引用,就像在其他语言(如C)中那样。这是因为默认情况下np.array传递了该引用,因此我们可以在fn()函数中访问和编辑传递的数组中的元素。