【问题标题】:How to manipulate expressions in matrices using sympy?如何使用 sympy 操作矩阵中的表达式?
【发布时间】:2017-02-06 07:01:49
【问题描述】:

我正在编写一个库,我可以使用库中的对象构造表达式。例如,xy 是我库中的实例,我可以构造如下表达式:

# below is a simplified version of my class 
class MySymbol(object):
    import random
    _random_value = random.randint(1,4)

    def __init__(self, value):
        self.value = value

    def __add__(self, symbol):
        return MySymbol(self.value + symbol.value)

    def __mul__(self, symbol):
        return MySymbol(self.value * symbol.value)

    def __repr__(self):
        return str(self.value)

    def _get_random_value(self):
        return self._random_value

x,y = sympy.symbols('x y')


x = MySymbol(9)
y = MySymbol(3)

import sympy
A = sympy.Matrix([[x,y],[x,y]])
B = sympy.Matrix([[x+y,x*y]])

矩阵运算也是如此。 sympy.Matrix 类将这些元素转换为 sympy.core.numbers.Integer,当我希望它们保持其类型 MySymbol

BA=B*A
print type(BA[0,0])
print type(x*x+y*x+x*x*y) # first element of matrix in *symbolic* form

<class 'sympy.core.numbers.Integer'>
<class '__main__.MySymbol'>

现在,因为BA[0,0] 不再是MySymbol 类型,我无法调用我想要的方法:

BA[0,0]._get_random_value()  # DOES NOT WORK 
>> AttributeError: 'Integer' object has no attribute '_get_random_value'


expression = x*x+y*x+x*x*y
expression._get_random_value()   # THIS DOES WORK
>> 4

如何利用sympy.Matrix 的矩阵乘法,但仍允许矩阵的元素保留其MySymbol 的类类型?并且仍然允许访问他们的所有方法(例如_get_random_value())?

【问题讨论】:

  • 稍微清理了这个问题。希望它有助于使其更清晰
  • 是否可以从 sympy.core.numbers.Integer 继承 MySymbol?
  • 我无法想象该解决方案。你能发表你的想法吗?或者我们可以让MySymbol 继承sympy.Matrix
  • 从 Matrix 继承是没有意义的。您希望 MySymbols 成为矩阵的元素,而不是矩阵本身。
  • 我明白了,我想知道该怎么做。

标签: python python-2.7 oop matrix sympy


【解决方案1】:

您需要从 SymPy 类继承子类才能在 SymPy 中使用它。根据你的类在做什么,会告诉你子类是什么类,但最典型的超类是Expr。请参阅我对一个非常相似的问题的回答 here

【讨论】:

  • 哇,这些问题的时机很好。我去看看,谢谢。
  • 是的,这就是我在对上述问题的评论中所说的 ^^ 。虽然不确定实现这一点....
  • 你能告诉我一个如何使用子类的例子吗? @asmeurer
猜你喜欢
  • 2016-04-09
  • 1970-01-01
  • 1970-01-01
  • 2019-09-16
  • 2019-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-11
相关资源
最近更新 更多