Sympy数组完成数值替换后能否正确切片?
解决Sympy IndexedBase替换数组后索引未解析的问题
问题出在你使用了普通符号作为索引变量,Sympy的IndexedBase需要搭配专门的Idx索引类型才能正确匹配数组索引。以下是两种可行的解决方法:
方法一:使用Idx定义索引变量
将普通符号k替换为Sympy的Idx类型,它是为张量/数组索引设计的专用类型,能和IndexedBase的替换逻辑兼容:
import numpy from sympy import Array, IndexedBase, Idx # 定义索引变量k,可指定取值范围(对应3行矩阵的行索引0-2) k = Idx('k', 3) M = IndexedBase('M') M_vals = numpy.array(( (0, 1, 2), (3, 4, 5), (6, 7, 8) )) # 替换后执行计算 result = M[k, 0].subs(M, Array(M_vals)).doit() print(result)
运行输出:[0, 3, 6],即正确提取矩阵的第一列向量。如果不需要限制索引范围,也可以直接写k = Idx('k')。
方法二:直接使用Sympy Matrix类型
如果不需要IndexedBase的符号化表示,直接用Sympy的Matrix可以更直观地处理索引:
from sympy import Matrix, symbols k = symbols('k', integer=True, positive=True) M = Matrix([ [0, 1, 2], [3, 4, 5], [6, 7, 8] ]) # 若要直接提取第一列,无需符号索引 column_vector = M[:, 0] print(column_vector)
运行输出:Matrix([[0], [3], [6]]),直接得到第一列的列向量。
原代码失效原因
普通符号k无法被Sympy识别为数组的维度索引,而Idx类型会被索引解析逻辑识别,从而将M[k, 0]正确映射为数组第0列的所有行元素。
内容的提问来源于stack exchange,提问作者HerpDerpington
相关产品推荐
相关产品推荐

