我想要繁殖两个小但非常复杂的矩阵。我用sympy做过这个:
C=sympy.MatMul(A,B,hold=True)
这给了我一个MatMul对象,它可以节省大量的时间,而且我对符号表达不感兴趣,而是我想在稍后的特定点进行评估。
如果这是我的计算结束,那就没问题,但是我需要使用C的元素来定义一个新的等式,但是,我无法对其进行索引。我得到以下内容,
In [286]: C[0]
Traceback (most recent call last):
File "<ipython-input-286-829e2440bf19>", line 1, in <module>
C[0]
File "C:\Anaconda3\lib\site-packages\sympy\matrices\expressions\matexpr.py", line 242, in __getitem__
raise IndexError("Single index only supported for "
IndexError: Single index only supported for non-symbolic matrix shapes.
有可能以某种方式索引这样的对象吗?例如,在maple中我可以使用分号来抑制输出,同时保留有关结果对象结构的信息,以便我可以为其编制索引。
答案 0 :(得分:3)
您可以为C
的元素编制索引,例如C[0,0]
。所以这将给你第一行作为列表:
row0 = [C[0, k] for k in range(C.shape[1])]
这是一个例子。 x
和y
是同情符号。
In [40]: A
Out[40]:
Matrix([
[2*x + 1, x + 3],
[ -2, 3]])
In [41]: B
Out[41]:
Matrix([
[-3, 3],
[ y, 2*y]])
In [42]: C = sympy.MatMul(A, B, hold=True)
In [43]: C[0,0]
Out[43]: -6*x + y*(x + 3) - 3
In [44]: [C[0,k] for k in range(C.shape[1])]
Out[44]: [-6*x + y*(x + 3) - 3, 6*x + 2*y*(x + 3) + 3]
答案 1 :(得分:1)
为了解释错误,通常,单个索引逐行索引矩阵:
In [8]: M = Matrix([[1, 2], [3, 4]])
In [9]: M
Out[9]:
⎡1 2⎤
⎢ ⎥
⎣3 4⎦
In [10]: M[0]
Out[10]: 1
In [11]: M[1]
Out[11]: 2
In [12]: M[2]
Out[12]: 3
In [14]: M[3]
Out[14]: 4
对于符号矩阵符号,将其计算为行,列索引。例如,
In [16]: MatrixSymbol('A', 3, 4)[0]
Out[16]: A₀₀
In [17]: MatrixSymbol('A', 3, 4)[10]
Out[17]: A₂₂
元素A[10]
自动转换为A[2, 2]
,因为A有4列,所以10是第三行的第三列(请记住,所有内容都是0索引的)。
但是,如果您的形状是符号,特别是列数,例如A
是mxn,则无法知道列A[i]
所指的行(n % i
是象征性的)。也许,可以更改SymPy以使A[i]
符号地返回A[i//n,i%n]
,但是您通常希望按行,列显式引用矩阵元素,所以如果您真的想要它,您可以手动执行。此外,此公式没有边界检查(如果i >= n*m
元素超出范围)。
严格来说,A[0]
可能会起作用,因为无论A的形状如何,它总是A[0, 0]
。但是,这将是一个特例,SymPy选择不允许它因为无论如何都可以写明确的A[0, 0]
。