Вопрос по python, scipy – Оценить выражение sympy из массива значений

34

Я экспериментирую с sympy и столкнулся с проблемой, которую не могу решить.

Используя scipy, я могу написать выражение и оценить его для массива значений x следующим образом:

import scipy
xvals = scipy.arange(-100,100,0.1)
f = lambda x: x**2
f(xvals)

Используя sympy, я могу написать то же выражение, что и следующее:

import sympy
x = sympy.symbols('x')
g = x**2

Я могу оценить это выражение для одного значения, выполнив следующие действия:

g.evalf(subs={x:10})

Однако я не могу понять, как оценить его для массива значений x, как я это делал со scipy. Как бы я это сделал?

Ваш Ответ

3   ответа
-3

import sympy
x = sympy.symbols('x')
f = lambda x: x**2
print [f(k) for k in range(4)]

или вы также можете попробовать

g = x**2
print [g.subs(x,k) for k in range(4)]
Ваш первый пример никак не использует sympy. Символ, который вы определяете, не доступен в лямбде. Более того, вопрос был о массивах NumPy и, вероятно, о всех специальных операциях для каждого элемента, поддерживаемых NUMPY. Это не функции, присутствующие в списке Python (то, что вы на самом деле используете).
41

в настоящее время SymPy не гарантирует поддержку для массивов numpy, что вам и нужно в этом случае. Проверьте это сообщение об ошибкеhttp://code.google.com/p/sympy/issues/detail?id=537

Во-вторых, если вы хотите оценить что-то численно дляmany значения SymPy - не лучший выбор (в конце концов, это символическая библиотека). Используйте numpy и scipy.

Однако действительной причиной для численной оценки чего-либо будет то, что получение выражения для оценки было трудным, поэтому вы выводите его в SymPy, а затем оцениваете в NumPy / SciPy / C / Fortran. Чтобы перевести выражение в numpy, просто используйте

from sympy.utilities.lambdify import lambdify
func = lambdify(x, big_expression_containing_x,'numpy') # returns a numpy-ready function
numpy_array_of_results = func(numpy_array_of_arguments)

Проверьте документацию lambdify для более подробной информации. Имейте в виду, что у lambdify все еще есть некоторые проблемы и, возможно, потребуется переписать.

И просто как примечание, если вы хотите оценить выраженияreally Много раз вы можете использовать модуль codegen / autowrap из sympy для создания кода на языке Fortran или C, который упаковывается и вызывается из python.

РЕДАКТИРОВАТЬ: обновленный список способов сделать чисел в SymPy можно найти в викиhttps://github.com/sympy/sympy/wiki/Philosophy-of-Numerics-and-Code-Generation-in-SymPy

8

принятый ответ дает понять, что ОП искалnumerical оценки, я все же укажу, что можно также иметьsymbolic оценка с использованиемsymarray:

import sympy
xs = sympy.symarray('x', 10)
f = lambda x: x**2
f(xs)

доходность

array([x_0**2, x_1**2, x_2**2, x_3**2, x_4**2, x_5**2, x_6**2, x_7**2,
       x_8**2, x_9**2], dtype=object)

Обратите внимание, что это также используетnumpy массив внутри, но один заполненsympy.Expressions.

@fccoelho Я бы использовал numpy для начала или, по крайней мере,lambdify из принятого ответа. Но если по какой-то причине у вас действительно есть массив символических выражений, вам, вероятно, придется использовать понимание списка (илиfor петля). Может быть, есть более простой способ, но я никогда не беспокоилсяsymarrayмного. Мой ответ действительно только здесь, как sidenote
Но symarray не присваивает числовое значение каждому x_i, так как бы вы оценили выражение для arange, указанного в вопросе?

Похожие вопросы