Как использовать Sympys NumPyPrinter?

#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 решили сделать это таким образом.