2014-01-16 60 views
4

使用sympy Matrix或numpy数组的sympy符号,如何使用元素智对数?如何在sympy中获取矩阵的元素对数?

举例来说,如果我有:

m=sympy.Matrix(sympy.symbols('a b c d')) 

然后np.abs(m)工作正常,但np.log(m)不工作( “AttributeError错误:日志”)。

任何解决方案?

+0

请张贴确切的回溯。 –

+0

@AshwiniChaudhary,这是我得到的确切回溯。 – Bitwise

+0

Python的回溯通常是4-5行。 –

回答

3

使用Matrix.applyfunc

In [6]: M = sympy.Matrix(sympy.symbols('a b c d')) 

In [7]: M.applyfunc(sympy.log) 
Out[7]: 
⎡log(a)⎤ 
⎢  ⎥ 
⎢log(b)⎥ 
⎢  ⎥ 
⎢log(c)⎥ 
⎢  ⎥ 
⎣log(d)⎦ 

您不能使用np.log,因为它执行的是数字日志,但您需要符号版本,即sympy.log

+0

嘿,刚才看到你是sympy的首席开发者 - 尊敬!做得好。如果矩阵矢量化更类似于Matlab符号工具箱,那将是非常棒的。 – Bitwise

+0

好吧,我没有编写大部分代码。有很多贡献者。 – asmeurer

+0

如果您有任何建议让它更好,请告诉我们。 – asmeurer

1

如果你想要的元素单元数,和你的矩阵都将是单柱,你就应该能够使用列表理解:

>>> m = sympy.Matrix(sympy.symbols('a b c d')) 
>>> logm = sympy.Matrix([sympy.log(x) for x in m]) 
>>> logm 
Matrix([ 
[log(a)], 
[log(b)], 
[log(c)], 
[log(d)]]) 

这是一种丑陋,但你可以包装在便于功能,如:

>>> def sp_log(m): 
    return sympy.Matrix([sympy.log(x) for x in m]) 

>>> sp_log(m) 
Matrix([ 
[log(a)], 
[log(b)], 
[log(c)], 
[log(d)]]) 
+0

谢谢 - 我猜没有矢量化的解决方案。我希望sympy可以很好地替代Matlab的符号,但是我看到sympy在处理矩阵方面还没有。 – Bitwise