【问题标题】:How to access sympy matrix elements for row operations?如何访问行操作的 sympy 矩阵元素?
【发布时间】:2019-10-23 08:25:15
【问题描述】:

我正在寻找一种访问 sympy 矩阵元素以执行行操作的方法,但似乎找不到这样做的方法或找到任何描述该过程的现有文档。

例如,假设我有以下代码:

import sympy as sp
from sympy import *

matrix = sp.Matrix([[3,2,2],[1,2,3]])

我想将第一行和第二列中的元素分开,在本例中为 2。我能想到的一种非常老套的方法是执行以下操作:

a = int(matrix.row(0).col(2)[0])
matrix.row(0)/a

但现在我的矩阵的第一行是

[3/2,1,1]

这次我想再次将行除以 3/2,对此我以前的方法不起作用。如何执行这些行操作,如何让它们更新原始矩阵? (即,当我将一行除以 3 时,它会更新原始矩阵中的行,而不仅仅是返回一个仅反映更新行的单独矩阵)

还有,是否有任何简单的方法可以使用 sympy 矩阵进行行交换/交换(即 r1 r2)?

编辑:

我发现我可以通过简单地使用matrix[row#,:]/matrix[row#,column#] 来完成我的问题的除法部分,但我仍然不确定如何让这个行操作直接反映在原始矩阵中,或者如何进行行交换。

【问题讨论】:

    标签: python matrix sympy


    【解决方案1】:

    我还是个sympy 的新手,但在numpy 方面知识渊博。所以让我们看看sympy 的行为方式是否大致相同。

    isympy 会话中:

    In [67]: M = Matrix([[3,2,2],[1,2,3]])                                                                 
    
    In [68]: M                                                                                             
    Out[68]: 
    ⎡3  2  2⎤
    ⎢       ⎥
    ⎣1  2  3⎦
    
    In [69]: M[0,:]             # a row, using a numpy style indexing                                                                                        
    Out[69]: [3  2  2]
    
    In [70]: M[0,1]             # an element                                                                           
    Out[70]: 2
    
    In [71]: M[0,:]/M[0,1]      # division, producing a new matrix                                                                            
    Out[71]: [3/2  1  1]
    
    In [72]: M                  # no change to M                                                                           
    Out[72]: 
    ⎡3  2  2⎤
    ⎢       ⎥
    ⎣1  2  3⎦
    
    In [73]: M[0,:]/=M[0,1]     # but with a /= (Python syntax)                                                                           
    
    In [74]: M                                                                                             
    Out[74]: 
    ⎡3/2  1  1⎤
    ⎢         ⎥
    ⎣ 1   2  3⎦
    
    In [75]: M[0,:]/=3/2      # again                                                                             
    
    In [76]: M                                                                                             
    Out[76]: 
    ⎡1.0  0.666666666666667  0.666666666666667⎤
    ⎢                                         ⎥
    ⎣ 1           2                  3        ⎦
    

    进行了浮点除法;我怀疑使用不同的除数我可以进行适当的分数除法。

    In [83]: M = Matrix([[3,2,2],[1,2,3]])                                                                 
    
    In [84]: M[0,:]/=M[0,1]                                                                                
    
    In [85]: M[0,:]/=Rational(3,2)                                                                         
    
    In [86]: M                                                                                             
    Out[86]: 
    ⎡1  2/3  2/3⎤
    ⎢           ⎥
    ⎣1   2    3 ⎦
    

    【讨论】:

      【解决方案2】:

      当我有这样的问题时,我会尝试搜索目录寻求帮助:

      >>> [w for w in dir(Matrix) if 'op' in w and not w.startswith('_')]
      [col_op, copy, copyin_list, copyin_matrix, elementary_col_op, elementary_row_op, 
      row_op, zip_row_op]
      
      >>> help(Matrix.row_op)
      Help on method row_op in module sympy.matrices.dense:
      
      row_op(self, i, f) unbound sympy.matrices.dense.MutableDenseMatrix method
          In-place operation on row ``i`` using two-arg functor whose args are
          interpreted as ``(self[i, j], j)``.
      ...
      
      >>> help(Matrix.elementary_row_op)
      Help on method elementary_row_op in module sympy.matrices.matrices:
      
      elementary_row_op(self, op='n->kn', row=None, k=None, row1=None, row2=None) unbound 
      sympy.matrices.dense.MutableDenseMatrix method
          Performs the elementary row operation `op`.
      
          `op` may be one of
      
              * "n->kn" (row n goes to k*n)
              * "n<->m" (swap row n and row m)
              * "n->n+km" (row n goes to row n + k*row m)
      
          Parameters
          ==========
      
          op : string; the elementary row operation
          row : the row to apply the row operation
          k : the multiple to apply in the row operation
          row1 : one row of a row swap
          row2 : second row of a row swap or row "m" in the row operation
                 "n->n+km"
      

      所以看起来两者都可以使用。

      >>> m =  Matrix([[3,2,2],[1,2,3]])
      >>> m.row_op(0, lambda x, j: x/2)
      >>> m
      Matrix([
      [3/2, 1, 1],
      [  1, 2, 3]])
      >>> m.row_op(0, lambda x, j: x/(3/2))
      >>> m
      Matrix([
      [1, 2/3, 2/3],
      [1,   2,   3]])
      

      >>> m =  Matrix([[3,2,2],[1,2,3]])
      >>> m.elementary_row_op('n->kn',row1=0,k=1/3)
      Matrix([
      [1, 2/3, 2/3],
      [1,   2,   3]])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-16
        • 1970-01-01
        • 1970-01-01
        • 2013-02-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多