【问题标题】:sympy, obtaining the upper triangle of a symmetric matrix as a flattened arraysympy,获取对称矩阵的上三角形作为展平数组
【发布时间】:2013-07-05 17:10:23
【问题描述】:

我在sympy 中有以下对称矩阵:

m = sympy.Matrix([[x**2, x**3, x**4],
                  [x**3, x**5, x**6],
                  [x**4, x**6, x**7]])

我的目标是获得这个矩阵的上三角形作为一个扁平数组,比如[x**2, x**3, x**4, x**5, x**6, x**7],可以被lambdify处理。

我使用 In numpy 来辅助实现这一点:

f = lambdify((x), sympy.Matrix(np.array(m)[np.triu_indices(m.shape[0])]))

所以f(2.) 给出:

[[   4.    8.   16.   32.   64.  128.]]

问题是:

  • sympy 中是否有本地方法可以做到这一点?

奖金:

  • 有没有办法获得1D-array 而不是matrix

【问题讨论】:

  • 您是否有任何具体原因更喜欢 sympy 解决方案而不是 numpy 解决方案?因为否则,与 numpy 相比,sympy 相当慢还是与其他问题无关?
  • 是的,我是同一个人......这与另一个问题完全相关。我可以达到great integration performance using Cython, check here...

标签: python arrays numpy matrix sympy


【解决方案1】:

我认为 SymPy 中还没有直接执行此操作的功能(但欢迎使用补丁!)。你可以很容易地写一个。

您可以尝试使用cse

>>> print cse(a)
([(x0, x**3), (x1, x**4), (x2, x**6)], [Matrix([
[x**2,   x0,   x1],
[  x0, x**5,   x2],
[  x1,   x2, x**7]])])

这将防止您多次评估同一个表达式。如果您的实际表达式真的只是x 的幂,那么您可以利用计算x 的所有幂涉及大量重复工作这一事实来编写更有效的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多