У меня есть функция, которая выглядит так:
def test(x,q0):
q = q0/(1+x**2)
h_func = lambda t: 1/sp.cosh(t)**2
fun = lambda t: sp.log(1+q*h_func(t))
return spi.quad(fun,-sp.inf,sp.inf)[0]
Как мне сделать его векторизованным, чтобы он мог принимать x
как массив? Прямо сейчас это показывает
TypeError: только массивы длины 1 могут быть преобразованы в скаляры Python
Я могу добиться этого в Matlab, используя
integral(fun,-Inf,Inf,'ArrayValued',true)
,
но есть ли эквивалент Python 'ArrayValued',true
в Matlab?
test(np.array([1, 2, 3]), 0.1)
, какой должен быть результат? - person kazemakase   schedule 21.12.2017array([ 0.0983764 , 0.03973614, 0.01993369])
, что мы и получим, если применим функцию к каждому элементу вnp.array([1,2,3])
отдельно. - person Physicist   schedule 21.12.2017test = np.vectorize(test)
, но учтите, чтоvectorize
не является функцией производительности :) - person kazemakase   schedule 21.12.2017x
внутриtest
? Я сомневаюсь, что это было бы намного медленнее, чем вызов функции, которая выполняет итерацию за вас (если бы такая функция существовала). - person Thomas Kühn   schedule 21.12.2017sp.optimize.curve_fit
требуется функция, которая принимает векторz
, поэтому я хочу, чтобы функция была векторизуемой. Я могу добавить цикл for внутри функции, но мне кажется, что это довольно медленно, особенно когда он вычисляется много раз во время оптимизации. Я могу подумать о предварительной оценке функции над двумерным массивом для различныхt
иz
и самостоятельно выполнить числовое интегрирование, используяtrapz
илиsimps
, но мне интересно, существует ли лучший метод. - person Physicist   schedule 21.12.2017