Размещение 2D-функций в python - PullRequest
1 голос
/ 10 июля 2020

У меня есть две переменные, x и y, принимающие значения в x_values ​​и y_values:

x_values = np.linspace(x_min,x_max,n)
y_values = np.linspace(y_min,y_max,n)

И измеренный 2D-массив z (матрица nxn).

Я бы хотел соответствовать z с функцией, как в scipy.optimize.curve_fit. Но если я прав, это работает только для одномерных функций.

Моя мечта была бы примерно такой:

curve_fit2D(custom_2D_function, (x_values,y_values), z)

Я ничего не смог найти в scipy документации, есть что-то что мне не хватает?

1 Ответ

2 голосов
/ 10 июля 2020

Из документации curve_fit :

xdata: array_like or object

    The independent variable where the data is measured. Should usually be an 
    M-length sequence or an (k,M)-shaped array for functions with k predictors, 
    but can actually be any object.

Это означает, что каждый столбец вашего xdata должен соответствовать одной записи z.

Решение

Измените форму данных так, чтобы у вас была одна пара (x, y) для каждой z. Предполагая, что (x[i], y[j]) сочетается с z[i, j], вы можете изменить форму таким образом.

z_vec = z.flatten()
x_data = np.array([
    (x[i // z.shape[1]], y[i % z.shape[1]]) 
    for i in range(len(z_vec))
]).T

assert x_data.shape[1] == len(z_vec)
assert x_data.shape[0] == 2

Затем используйте curve_fit как обычно.

curve_fit(custom_2D_function, x_data, z_vec)
...