简体   繁体   English

如何访问用于行操作的sympy矩阵元素?

[英]How to access sympy matrix elements for row operations?

I'm looking for a way to access sympy matrix elements to perform row operations, but can't seem to come up with a way to do so or find any existing documentation that describes the process. 我正在寻找一种方法来访问sympy矩阵元素来执行行操作,但似乎无法想出办法或找到描述该过程的任何现有文档。

For example, let's say I have the following code: 例如,假设我有以下代码:

import sympy as sp
from sympy import *

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

I want to divide the element in the first row and second column, which is 2 in this case. 我想在第一行和第二列中划分元素,在这种情况下为2。 A really hacky way to do so that I can think of would be to do the following: 我能想到的一个真正的hacky方法是执行以下操作:

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

But now the first row of my matrix is 但现在我的矩阵的第一行是

[3/2,1,1]

and I want to divide the row again by 3/2 this time, for which my previous method does not work. 我想再次将行除以3/2,我之前的方法不起作用。 How can I perform these row operations, and how can I have them update the original matrix? 如何执行这些行操作,如何让它们更新原始矩阵? (ie, when i divide a row by 3, it updates the row in the original matrix and doesn't just return a separate matrix reflecting just the updated row) (即,当我将一行除以3时,它会更新原始矩阵中的行,而不只是返回仅反映更新行的单独矩阵)

And, is there any simple way to do row swaps/interchanges (ie r1 <--> r2) with a sympy matrix? 并且,有没有简单的方法来使用sympy矩阵进行行交换/交换(即r1 < - > r2)?

EDIT: 编辑:

I figured out that I can do the division portion of my question by simply using matrix[row#,:]/matrix[row#,column#] , but I still am unsure of how to have this row operation be directly reflected in the original matrix, or how to do row swaps. 我想通过简单地使用matrix[row#,:]/matrix[row#,column#]我可以做我的问题的除法部分,但我仍然不确定如何将这个行操作直接反映在原始矩阵,或如何进行行交换。

When I have a question like this I try to search the directory for assistance: 当我有这样的问题时,我会尝试搜索目录以寻求帮助:

>>> [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"

So it looks like either could be used. 所以看起来两者都可以使用。

>>> 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]])

or 要么

>>> 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]])

I'm still a bit of a sympy novice, but knowledgeable in numpy . 我还是有点的sympy新手,但在知识渊博numpy So let's see if sympy behaves in much the same way. 因此,让我们看一下sympy表现方式是否相同。

In an isympy session: 在一个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        ⎦

That did a floating point division; 那做了浮点划分; I suspect with a different divisor I could have done a proper fractional division. 我怀疑有一个不同的除数我可以做一个适当的分数。

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 ⎦

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

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