SymPy: Delete multiple rows of a matrix

Viewed 77

Is there a method to delete multiple rows of a matrix in SymPy (without using NumPy)?

I understand that .row_del() can only delete one row at a time.

from sympy import *

a_1_1, a_1_2, a_1_3 = symbols ('a_1_1 a_1_2 a_1_3')
a_2_1, a_2_2, a_2_3 = symbols ('a_2_1 a_2_2 a_2_3')
a_3_1, a_3_2, a_3_3 = symbols ('a_3_1 a_3_2 a_3_3')

A = Matrix ([
    [a_1_1, a_1_2, a_1_3], 
    [a_2_1, a_2_2, a_2_3], 
    [a_3_1, a_3_2, a_3_3]
])

A.row_del (1 : 2)

does not (yet?) work:

    A.row_del (1 : 2)
                 ^
SyntaxError: invalid syntax
3 Answers

You can use slicing or outer indexing to select the rows that you want:

In [8]: A = MatrixSymbol('A', 3, 3).as_explicit()

In [9]: A
Out[9]: 
⎡A₀₀  A₀₁  A₀₂⎤
⎢             ⎥
⎢A₁₀  A₁₁  A₁₂⎥
⎢             ⎥
⎣A₂₀  A₂₁  A₂₂⎦

In [10]: A[:1,:]
Out[10]: [A₀₀  A₀₁  A₀₂]

In [11]: A[[0,2],:]
Out[11]: 
⎡A₀₀  A₀₁  A₀₂⎤
⎢             ⎥
⎣A₂₀  A₂₁  A₂₂⎦

The : syntax to select a slice of items is only supported inside of square brackets in Python. That's why the error is SyntaxError. So even if the row_del function did support deleting multiple rows at once, the syntax for it would not look like row_del(1:2), because that's not valid Python.

Regarding your follow-up question, part of the beauty of working in Python is that you can write your own utility functions to make things work the way you want. So you could make a function to create a matrix that automatically comes back with indices as desired. Note, too, that selecting rows or columns with a list will put them in the requested order:

>>> a1rc = lambda a,r,c: MatrixSymbol(a, r+1, c+1).as_explicit()[1:,1:]
>>> a1rc("A",3,4)
Matrix([
[A[1, 1], A[1, 2], A[1, 3], A[1, 4]],
[A[2, 1], A[2, 2], A[2, 3], A[2, 4]],
[A[3, 1], A[3, 2], A[3, 3], A[3, 4]]])
>>> _[[2,0],:]  # row 2 will come first, then row 0
Matrix([
[A[3, 1], A[3, 2], A[3, 3], A[3, 4]],
[A[1, 1], A[1, 2], A[1, 3], A[1, 4]]])
Related