0

Following this similar question I tried to retrieve the symbols of an expression containing matrix symbolic elements, without success:

import sympy as sy
P = sy.Matrix(sy.MatrixSymbol('P', 5, 2))
expr = P[2,:]*sy.transpose(P[3,:]) # Matrix([[P[2, 0]*P[3, 0] + P[2, 1]*P[3, 1]]])

expr.free_symbols # returns `{P}`
expr.atoms(sy.Symbol) # returns an empty set

How can I obtain from expr the sequence/set P[2,0],P[2,1],P[3,0],P[3,1]?

mmj
  • 5,514
  • 2
  • 44
  • 51

1 Answers1

2

You need to know the type of the objects that you want to extract. You can use SymPy's srepr function to show what the expression consists of:

In [11]: expr
Out[11]: [P₂₀⋅P₃₀ + P₂₁⋅P₃₁]

In [12]: srepr(expr)
Out[12]: "ImmutableDenseMatrix([[Add(Mul(MatrixElement(MatrixSymbol(Str('P'), Integer(5), Integer(2)), Integer(2), Integer(0)), MatrixElement(MatrixSymbol(Str('P'), Integer(5), Integer(2)), Integer(3), Integer(0))), Mul(MatrixElement(MatrixSymbol(Str('P'), Integer(5), Integer(2)), Integer(2), Integer(1)), MatrixElement(MatrixSymbol(Str('P'), Integer(5), Integer(2)), Integer(3), Integer(1))))]])"

The parts that you want are the MatrixElement expressions so:

In [16]: from sympy.matrices.expressions.matexpr import MatrixElement

In [17]: expr.atoms(MatrixElement)
Out[17]: {P₂₀, P₂₁, P₃₀, P₃₁}
Oscar Benjamin
  • 12,649
  • 1
  • 12
  • 14