2017-08-09 14 views
1

私はnumpysを使用しようとしていますnumpy.einsumシンボリックsympyの配列上の関数sympysの残酷なアインシュタインの総和の能力の欠如のため。私はこれまでのところ、これを試してみました: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

基本的にはこれが不可能です。 [Here's](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

関連する問題