использование sympy для компиляции функции с аргументами массива


Мне интересно, Как правильно использовать процедуры компиляции функций sympy (например, autowrap) для создания функции, которая принимает входные данные массива.

С помощью lambdify я могу сделать одно из следующих действий:

import numpy as np
import sympy as sp
x, y, a,b = sp.symbols('x,y,a,b')
f=a*x**2 + b*y**3

A)

L1 = sp.lambdify([x,y,a,b],f)
v1=np.array([1,2])
v2=np.array([3,4])
L1(*np.concatenate([v1,v2]))

35

B)

M1=sp.Matrix([x,y])
M2=sp.Matrix([a,b])
L2 = sp.lambdify([M1,M2],f)
L2(v1,v2)

35

Предположительно, под капотом (B) происходит то же самое, что и (A).

Но с autowrap у меня есть только вариант А, насколько я могу судить.

from sympy.utilities.autowrap import autowrap
A1 = autowrap(f,args=[x,y,a,b],backend='cython')
A1(*np.concatenate([v1,v2]))

35.0

A2 = autowrap(f,args=[M1,M2],backend='cython')

CodeGenArgumentListError: ("список аргументов не уточнил: А, Б, В, Г ", [InputArgument(а), InputArgument(б), InputArgument(х), InputArgument(г)])

Есть ли способ сделать это? Мой пример использования-компиляция функции dy/dx для моделирования ODE. Функция (гораздо более запутанная, чем в приведенном выше примере) должна принимать массив значений x и массив параметров. Прямо сейчас я использую код выше, с расширением списка np.concatenate и python, и если я профилирую код, конкатенация на самом деле занимает больше времени, чем вычисление. Так что я хотел бы обойти это и попросить sympy взять последнее утверждение и сгенерировать некоторый код C, который выглядит как

double f(double* M1,double* M2) {
   return M1[0]*pow(M2[0],2)+M1[1]*pow(M2[1],3)
}

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

Возможно ли это? Есть ли лучший способ сделать это? Или я переосмысливаю / переоптимизирую здесь?

1 2

1 ответ:

Новый учебник scipy codegen описывает способ сделать это.

Пример, которому я смог следовать и изменить, находится здесь: http://www.sympy.org/scipy-2017-codegen-tutorial/notebooks/40-chemical-kinetics-cython.html

Обзор курса находится здесь: http://www.sympy.org/scipy-2017-codegen-tutorial/