Итерация по массиву питонов при использовании с scipy.optimize.curve_fit - PullRequest
2 голосов
/ 16 декабря 2011

Мне нужно перебрать элементы в массиве numpy, чтобы можно было обрабатывать любые нулевые элементы отдельно.Приведенный ниже код работает для простых оценок, но не при использовании с scipy.optimize.curve_fit ().Есть ли способ заставить эту работу работать с curve_fit fn?

import numpy as np
from matplotlib.pyplot import *
from scipy.optimize import curve_fit

def my_fn(x_array, b, a):
    y = []
    for x in np.nditer(x_array): #This doesn't work with curve_fit()
        if x == 0:
            y.append(0)
        else:
            y.append(b*(1/np.tanh(x/a) - a/x))
    return np.array(y)


x_meas = [0, 5, 20, 50, 100, 200, 600]
y_meas = [0, 0.275, 1.22, 1.64, 1.77, 1.84, 1.9]
xfit = np.linspace(0,600,601)
yfit2 = my_fn(xfit, 1.95, 8.2) #manual fit

#Not working
#popt, pcov = curve_fit(my_fn, x_meas, y_meas, p0=[1.95, 8.2]) 
#yfit1 = my_fn(xfit, *popt) #auto fit

figure(1)
plot(x_meas, y_meas, 'o', xfit, yfit2)
show()

Ответы [ 2 ]

3 голосов
/ 16 декабря 2011

Чтобы ответ Ларсмана действительно работал, вам также необходимо преобразовать ваши выборки данных в массивы NumPy:

x_meas = numpy.array([0, 5, 20, 50, 100, 200, 600], float)
y_meas = numpy.array([0, 0.275, 1.22, 1.64, 1.77, 1.84, 1.9], float)

(Преобразование y_meas не является строго необходимым.)

Вот код larsmans с моими предложениями:

def my_fn(x, b, a):
    y = np.zeros_like(x)
    nonzero = x != 0
    x = x[nonzero]
    y[nonzero] = b*(1/np.tanh(x/a) - a/x)
    return y
1 голос
/ 16 декабря 2011

Мне нужно перебрать элементы в массиве numpy, чтобы я мог обрабатывать любые нулевые элементы отдельно.

Нет, вы не делаете;это должно быть намного быстрее и работать везде:

def my_fn(x, b, a):
    y = np.zeros(x.shape)
    nonzero = np.where(x != 0)
    x = x[nonzero]
    y[nonzero] = b*(1/np.tanh(x/a) - a/x)
    return y
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...