Sympy执行关系运算时如何返回布尔类型的结果?
Sympy单位比较返回布尔值的实现方法
在使用sympy.physics.units模块进行带单位的数值比较时,直接使用关系运算符(>、<、==等)会返回未求值的关系表达式,而非预期的布尔值,示例如下:
>>> import sympy.physics.units as u >>> 10*u.cm > 20*u.mm 10*centimeter > 20*milimeter
解决方法
方法1:使用simplify直接对关系表达式求值
这是最简便的方案,调用Sympy内置的simplify函数处理关系表达式,会自动完成单位换算并返回布尔结果:
>>> import sympy.physics.units as u >>> from sympy import simplify >>> simplify(10*u.cm > 20*u.mm) True >>> simplify(10*u.cm < 20*u.mm) False
方法2:统一单位后提取数值比较
如果需要更可控的单位换算逻辑,可以先将两个量转换为相同单位,再提取数值部分进行比较:
>>> import sympy.physics.units as u >>> length_a = 10 * u.cm >>> length_b = 20 * u.mm >>> # 统一转换为毫米单位 >>> a_mm = u.convert_to(length_a, u.mm) >>> b_mm = u.convert_to(length_b, u.mm) >>> # args[0] 提取带单位量的数值部分 >>> a_mm.args[0] > b_mm.args[0] True
注意:两种方法都要求比较的两个量量纲一致,否则会抛出错误,符合物理运算规则。
原理解释
Sympy作为符号计算库,默认不会对关系运算直接求值,而是返回关系表达式对象用于后续的符号推导。只有主动调用求值类函数(如simplify)、或手动转换为纯数值后,才会得到布尔类型的比较结果。
内容的提问来源于stack exchange,提问作者Alex Naoki
相关产品推荐
相关产品推荐

