如何在Python中实现符号向量的平方运算?
解决方案
方法1:直接利用NumPy元素级运算 + 列表推导式化简
NumPy对包含SymPy符号的数组支持元素级运算,直接执行公式即可;化简时用列表推导式逐个处理元素比np.vectorize更可靠:
import numpy as np import sympy as sp a, b, c, f, g = sp.symbols('a b c f g') M = np.array([a, b, c]) # 直接完成公式的元素级运算 B = f * M ** 2 * g # 逐个化简数组中的符号表达式 B_simplified = np.array([sp.simplify(term) for term in B]) print(B_simplified) # 输出:array([a**2*f*g, b**2*f*g, c**2*f*g], dtype=object)
方法2:使用SymPy原生Matrix处理符号向量
如果以符号运算为主,更推荐用SymPy自带的Matrix类型,避免NumPy与SymPy的类型兼容问题:
import sympy as sp a, b, c, f, g = sp.symbols('a b c f g') M_sym = sp.Matrix([a, b, c]) # 对每个元素做平方运算后完成公式计算 B_sym = f * M_sym.applyfunc(lambda x: x**2) * g print(B_sym) # 输出:Matrix([[a**2*f*g], [b**2*f*g], [c**2*f*g]])
原方法失效的原因
np.vectorize(sp.simplify)(M**2)的问题在于:
M**2已经正确完成了元素级平方运算,得到array([a**2, b**2, c**2], dtype=object),此时用np.vectorize包裹simplify属于冗余操作。np.vectorize本质是循环语法糖,在处理SymPy符号对象时,可能因类型交互问题出现预期外结果,稳定性远不如列表推导式或SymPy原生方法。
内容的提问来源于stack exchange,提问作者Mo711
相关产品推荐
相关产品推荐

