Как определить векторизованную функцию, которая включает в себя интеграцию scipy?

У меня есть функция, которая выглядит так:

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?


person Physicist    schedule 21.12.2017    source источник
comment
Каков ожидаемый результат? Скажем, если вы вызвали его с помощью test(np.array([1, 2, 3]), 0.1), какой должен быть результат?   -  person kazemakase    schedule 21.12.2017
comment
она должна дать array([ 0.0983764 , 0.03973614, 0.01993369]), что мы и получим, если применим функцию к каждому элементу в np.array([1,2,3]) отдельно.   -  person Physicist    schedule 21.12.2017
comment
Быстрым и грязным решением было бы сделать test = np.vectorize(test), но учтите, что vectorize не является функцией производительности :)   -  person kazemakase    schedule 21.12.2017
comment
Есть ли конкретная причина, по которой вы не хотите просто перебирать x внутри test? Я сомневаюсь, что это было бы намного медленнее, чем вызов функции, которая выполняет итерацию за вас (если бы такая функция существовала).   -  person Thomas Kühn    schedule 21.12.2017
comment
Я хочу выполнить некоторую подгонку данных с помощью функции, похожей на ту, что в примере, и кажется, что sp.optimize.curve_fit требуется функция, которая принимает вектор z, поэтому я хочу, чтобы функция была векторизуемой. Я могу добавить цикл for внутри функции, но мне кажется, что это довольно медленно, особенно когда он вычисляется много раз во время оптимизации. Я могу подумать о предварительной оценке функции над двумерным массивом для различных t и z и самостоятельно выполнить числовое интегрирование, используя trapz или simps , но мне интересно, существует ли лучший метод.   -  person Physicist    schedule 21.12.2017
comment
Возможный дубликат векторизации NumPy с интеграцией   -  person    schedule 21.12.2017