Оценить выражение 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. Как мне это сделать?

  • Управление цветом выражения LaTeX в ipton qtconsole
  • Получите значение из набора решений, возвращаемого в качестве finiteset от Sympy
  • Хотите сделать мульти-вариационный минимум с помощью sympy
  • Как читать систему дифференциальных уравнений из текстового файла для решения системы с помощью scipy.odeint?
  • В чем разница между симпатией и шалфеем?
  • Как вычислить выражение с помощью sympy в python
  • Что вызывает эту ошибку (объект AttributeError: 'Mul' не имеет атрибута 'cos') в Python?
  • Как выполнить нелинейную оптимизацию с помощью scipy / numpy или sympy?
  • 3 Solutions collect form web for “Оценить выражение sympy из массива значений”

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

    Во-вторых, если вы хотите оценивать что-то численно для многих значений, то 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) 

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

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

    EDIT: список обновлений способов численного моделирования в SymPy можно найти на wiki https://github.com/sympy/sympy/wiki/Philosophy-of-Numerics-and-Code-Generation-in-SymPy

    В то время как принятый ответ дает понять, что ОП ищет количественную оценку, я все же буду symarray , что можно также иметь символическую оценку с помощью 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.Expr essions.

    пытаться

     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)] 
    Python - лучший язык программирования в мире.