【问题标题】:How can one suppress evaluation while still being able to index?如何在仍然能够索引的同时抑制评估?
【发布时间】:2016-09-07 17:20:59
【问题描述】:

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

【问题讨论】:

    标签: python numpy math indexing sympy


    【解决方案1】:

    您可以索引C 的元素,例如C[0,0]。所以这会给你第一行作为一个列表:

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

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

    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]
    

    【讨论】:

    • 谢谢。我的 C 矩阵是一个向量。我没有意识到我需要为该列编制索引。
    【解决方案2】:

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

    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 是 m x n,则无法知道 A[i] 指的是哪一行(n % i 是象征性的)。可能,SymPy 可以更改为使A[i] 象征性地返回A[i//n,i%n],但您通常希望按行、列显式引用矩阵元素,所以如果您真的想要,您可以手动执行。此外,此公式没有边界检查(如果 i &gt;= n*m 元素超出边界)。

    严格来说,A[0] 可能有效,因为无论 A 的形状如何,它始终是 A[0, 0]。但是,这将是一个特殊情况,SymPy 选择禁止它,因为它是可能的无论如何都要写明确的A[0, 0]

    【讨论】:

      猜你喜欢
      • 2014-10-26
      • 2022-01-22
      • 2014-05-31
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 2017-01-04
      • 1970-01-01
      • 2012-05-23
      相关资源
      最近更新 更多