2017-08-09 81 views
1

由于Sympys严重缺乏爱因斯坦求和约定的能力,我试图在符号sympy数组上使用numpys numpy.einsum函数。到目前为止,我已经试过这样:可能使用numpy方法内的sympy对象?

>>> from sympy import * 
>>> import numpy as np 
>>> a11,a12,a13,a21,a22,a23,a31,a32,a33 = symbols('a11,a12,a13,a21,a22,a23,a31,a32,a33') 
>>> np.einsum('ii', a) 
Traceback (most recent call last): 
    File "<pyshell#469>", line 1, in <module> 
    np.einsum('ii', a) 
    File "C:\Python35\lib\site-packages\numpy\core\einsumfunc.py", line 948, in einsum 
    return c_einsum(*operands, **kwargs) 
TypeError: invalid data type for einsum 
>>> a = Array([[a11,a12,a13],[a21,a22,a23],[a31,a32,a33]]) 
>>> np.einsum('ii', a) 
Traceback (most recent call last): 
    File "<pyshell#472>", line 1, in <module> 
    np.einsum('ii', a) 
    File "C:\Python35\lib\site-packages\numpy\core\einsumfunc.py", line 948, in einsum 
    return c_einsum(*operands, **kwargs) 
ValueError: einstein sum subscripts string contains too many subscripts for operand 0 

正如你可以看到我已经试过路过既是numpy本地阵列,也是一个sympy阵列都没有成功。这种类型的混合(对于模块中的数据类型而言)是否可以用于python类的一般情况,但也适用于这种情况?

+0

基本上这是不可能的。 [这里是](https://stackoverflow.com/questions/44780195/generating-np-einsum-evaluation-graph)一个类似问题的链接。取决于你需要什么,你可能可以重新使用那里的馅饼 –

+0

'einsum'使用编译后的代码将'ij - > ...'字符串转换为迭代方案。这个多维迭代是针对数值(浮点数,整数等)编译的 - 你知道'c'如何知道它何时使用双精度等等。一些numpy代码可以用对象dtype工作,这可能是一个指向' sympy'对象。但对于'einsum'来说并非如此。 – hpaulj

回答

1

NumPy的einsum需要数字数据(毕竟,NumPy中的“Num”是数字)。但SymPy可以自己处理符号张量收缩,与Tensor module

from sympy import * 
A = Matrix(MatrixSymbol("a", 3, 3)) 
trace = tensorcontraction(A, (0, 1)) 

返回a[0, 0] + a[1, 1] + a[2, 2]

+0

是的,但我试图做的不仅仅是张量收缩。我需要扩展大型表达式,例如弹性波动方程,在大多数表达式中它们完全基于爱因斯坦求和惯例 – user32882