from sympy.tensor.array import Array
from sympy import ImmutableDenseMatrix as Matrix
from numpy.lib.index_tricks import RClass, CClass, AxisConcatenator
[docs]class SymAxisConcatenatorMixin:
"""
A mix-in to convert numpy AxisConcatenator classes to use with sympy N-D
arrays.
"""
# support numpy >= 1.13
concatenate = staticmethod(
lambda *args, **kwargs: Array(
AxisConcatenator.concatenate(*args, **kwargs)
)
)
makemat = staticmethod(Matrix)
def _retval(self, res): # support numpy < 1.13
if self.matrix:
cls = Matrix
else:
cls = Array
return cls(super()._retval(res))
def __getitem__(self, key):
return super().__getitem__(tuple(
k if isinstance(k, str) else
Array(k) if hasattr(k, '__len__')
else Array([k])
for k in key
))
[docs]class SymRClass(SymAxisConcatenatorMixin, RClass):
pass
[docs]class SymCClass(SymAxisConcatenatorMixin, CClass):
pass
r_ = SymRClass()
c_ = SymCClass()
[docs]def empty_array():
"""
Construct an empty array, which is often needed as a place-holder
"""
a = Array([0])
a._shape = tuple()
a._rank = 0
a._loop_size = 0
a._array = []
a.__str__ = lambda *args, **kwargs: "[]"
return a