Python SymPy交换性符号函数传入元组后交换性失效求解
问题原因
SymPy的自定义符号函数实例的.is_commutative属性默认取两个值的逻辑与:一是你定义函数时传入的commutative参数值,二是所有传入参数的.is_commutative属性的逻辑与结果。
Python原生的列表、元组等容器不属于SymPy符号类型,本身没有可交换属性标记,SymPy会默认将这类非符号对象判定为不可交换,因此最终生成的函数实例交换性会失效。
解决方法
方法1:将容器参数转为SymPy内置的Tuple类型
SymPy提供了可交换的元组类型sympy.Tuple,把Python原生列表/元组转成该类型后传入即可保留交换性:
import sympy f = sympy.Function('f', commutative=True) # 转换Python列表为SymPy Tuple list_arg = sympy.Tuple(*[1,2]) print(f(list_arg).is_commutative) # 输出 True # 转换Python元组为SymPy Tuple tuple_arg = sympy.Tuple(*(3,4)) print(f(tuple_arg).is_commutative) # 输出 True
方法2:自定义函数类固定交换性
如果不想每次手动转换参数,可以继承sympy.Function重写交换性判定逻辑,强制固定返回True:
import sympy class FixedCommutativeFunc(sympy.Function): commutative = True # 重写属性逻辑,直接固定返回True,不受参数影响 @property def is_commutative(self): return True f = FixedCommutativeFunc print(f([1,2]).is_commutative) # 输出 True # 交换性验证 x = sympy.symbols('x') print(f([1,2]) * f(x) == f(x) * f([1,2])) # 输出 True
注意事项
第二种方法会强制该函数所有实例都为可交换,不受传入参数类型影响,使用前请确认该逻辑符合你的使用场景。
内容的提问来源于stack exchange,提问作者helal darak
相关产品推荐
相关产品推荐

