#python #numpy #sympy
#python #numpy #sympy
Вопрос:
Я пытаюсь напечатать свое Sympy-выражение в виде строки, готовой к использованию с Numpy. Я просто не могу понять, как это сделать.
Я обнаружил, что есть sp.printing.pycode: https://docs.sympy.org/latest/_modules/sympy/printing/pycode.html
На веб-странице указано, что «Этот модуль содержит принтеры кода python для обычного python, а также код с поддержкой NumPy и SciPy». , но я просто не могу понять, как заставить его выводить формат выражения numpy.
sp.printing.pycode(expr)
'math.cos((1/2)*alpha)*math.cos((1/2)*beta)'
Эта веб-страница также содержит class NumPyPrinter(PythonCodePrinter)
но я не знаю, как ее использовать. def pycode(expr, **settings)
просто кажется, что он все время используется return PythonCodePrinter(settings).doprint(expr)
по умолчанию.
Комментарии:
1. Вы пытались сделать
NumPyPrinter().doprint(expr)
?2. Как вы это называете?
sp.printing.NumPyPrinter().doprint(x)
приводит кmodule 'sympy.printing' has no attribute 'NumPyPrinter'
иsp.printing.pycode.NumPyPrinter().doprint(x)
приводит к'function' object has no attribute 'NumPyPrinter'
Ответ №1:
Определение pycode
почти тривиально:
def pycode(expr, **settings):
# docstring skipped
return PythonCodePrinter(settings).doprint(expr)
Вместо этого он должен быть простым для запуска NumPyPrinter().doprint(expr)
. Проблема в том, что sympy.printing
реэкспортируется pycode
функция, которая затеняет модуль с тем же именем. Тем не менее, мы все еще можем импортировать класс напрямую и использовать его:
import sympy as sy
from sympy.printing.pycode import NumPyPrinter
x = sy.Symbol('x')
y = x * sy.cos(x * sy.pi)
code = NumPyPrinter().doprint(y)
print(code)
# x*numpy.cos(numpy.pi*x)
Комментарии:
1. Именно это затенение мешает работе этого синтаксиса?
sympy.printing.pycode.NumPyPrinter().doprint(expr)
2. ДА. Это строка
from .pycode import pycode
вprinting/__init__.py
. Когда вы используетеscipy.printing.pycode
, вы используетеpycode
функцию вместоpycode
модуля. Я не знаю, почему ребята из sympy решили сделать это таким образом.