如何在sympy中对矩阵进行逐元素对数运算?

6

如何处理由sympy Matrix或numpy数组中的sympy符号构成的内容,以取得逐个元素的对数?

例如,如果我有:

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

然后np.abs(m)可以正常工作,但是np.log(m)无法工作("AttributeError:log")。
有解决方案吗?

请发布完整的回溯信息。 - Ashwini Chaudhary
@AshwiniChaudhary 这就是我得到的确切回溯。 - Bitwise
Python的回溯通常只有4-5行。 - Ashwini Chaudhary
@Bitwise 请参考github上的这个问题。显然,您不能在对象数组(例如sympy数组)上使用numpy.log - senshin
@senshin 就像我在问题中写的那样,是逐元素的。 - Bitwise
显示剩余3条评论
2个回答

8
使用 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,因为它执行的是数字log运算,但您需要符号版本,即sympy.log


嘿,刚看到你是sympy的首席开发者 - 真是令人敬佩!干得好。如果矩阵向量化能更像Matlab符号工具箱一样流畅,那就太棒了。 - Bitwise
好吧,其实我并没有写大部分的代码。这其中有很多贡献者。 - asmeurer
如果您有任何建议使其更好,请告诉我们。 - asmeurer
有没有一种方法可以传递对数的基数? - lingxiao
基础数是作为log的第二个参数给出的,但目前它只是除以log(base),所以log(x, y) 就相当于 log(x)/log(y)。因此在这种情况下,可以使用 M.applyfunc(sympy.log)/sympy.log(base) - 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)]])

谢谢 - 我想没有矢量化的解决方案。我希望SymPy能够很好地替代Matlab符号处理,但是我看到SymPy在处理矩阵方面还不够成熟。 - Bitwise

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接