繁体   English   中英

一个人如何仍然可以索引却抑制评估?

[英]How can one suppress evaluation while still being able to index?

我有两个小的但非常复杂的矩阵要相乘。 我已经使用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中,我可以使用分号来抑制输出,同时保留有关结果对象结构的信息,以便可以对其进行索引。

您可以索引C元素,例如C[0,0] 因此,这将为您提供第一行作为列表:

row0 = [C[0, k] for k in range(C.shape[1])]

这是一个例子。 xy是sympy符号。

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]

为了解释该错误,通常,单个索引逐行索引矩阵:

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]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM