重写sympy中的符号表达式时重写除法运算符

2024-09-30 01:27:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用Sympy来计算用户提供的符号表达式,但是除法运算符的行为与其他任何数学运算符不同。当用重写运算符对对象求值时,我得到了加法、减法和乘法的预期结果,而不是除法。下面的代码说明了我的问题:

import sympy
import numpy

class NewMath(int):

    def __add__(self, other):
        print "Adding!"
        return

    def __sub__(self, other):
        print "Subtracting!"
        return

    def __mul__(self, other):
        print "Multiplying!"
        return

    def __div__(self, other):
        print "Dividing!"
        return

three = NewMath(3)
four = NewMath(4)

three + four
three - four
three * four
three / four

# Override sympys default math
func_map = {'+':NewMath.__add__,
            '/':NewMath.__div__}

lambda_args = [sympy.Symbol(arg) for arg in ['three', 'four']]

print "Now sympy math:"
lambda_addition = sympy.lambdify(lambda_args, sympy.Symbol('three') + sympy.Symbol('four'), modules=func_map)
lambda_addition(three, four)

lambda_subtraction = sympy.lambdify(lambda_args, sympy.Symbol('three')  - sympy.Symbol('four'), modules=func_map)
lambda_subtraction(three, four)

lambda_multiplucation = sympy.lambdify(lambda_args, sympy.Symbol('three')  * sympy.Symbol('four'), modules=func_map)
lambda_multiplucation(three, four)

lambda_division = sympy.lambdify(lambda_args, sympy.Symbol('three')  / sympy.Symbol('four'), modules=func_map)
lambda_division(three, four)

输出:

^{pr2}$

我读过Sympy Docs并看到/运算符是一个常见的问题,但文档似乎只是指示除法将默认为整数除法,我看不到任何指示{}不能被重写的内容。您可以在我的示例中看到,我甚至尝试使用modules参数手动将division替换为自定义运算符,但没有成功。在

我也看到了{a2},这是否意味着我的事业没有希望了?在

我使用的是python2.7和sympy1.0


Tags: lambdaselfmodulesmapdefargs运算符symbol
1条回答
网友
1楼 · 发布于 2024-09-30 01:27:25

你的事业当然不是完全没有希望的。这里有几个选项可以让你开始。在

首先,似乎您了解了\__div__ \__truediv__和{}之间的区别,但是如果您还不了解,here是一些Python2.7文档。在

在Python2.7中,重写\__div__似乎应该做您想做的事情,除了您发现的关于a/b被计算为a * b^(-1)的{}文档除外。为了避免这个问题,您还可以重写求幂运算符。在

我尝试在python3环境中运行代码,更改print的所有实例,使它们具有圆括号,并将div的所有实例替换为truediv。在

这不是一个完整的答案,但我不能发表评论,所以这是你得到的!在

相关问题 更多 >

    热门问题