2013-07-17 19 views
5

numpy.dot製品に疑問があります。多次元配列のNumpy、ドットプロダクト

Iのようなマトリックス6x6の定義

C=np.zeros((6,6)) 
C[0,0], C[1,1], C[2,2] = 129.5, 129.5, 129.5 
C[3,3], C[4,4], C[5,5] = 25, 25, 25 
C[0,1], C[0,2] = 82, 82 
C[1,0], C[1,2] = 82, 82 
C[2,0], C[2,1] = 82, 82 

は、その後、私は、多次元アレイ

def long2short(m, n): 
    """ 
    Given two indices m and n of the stiffness tensor the function 
    return i the index of the Voigt matrix 
    i = long2short(m,n) 
    """ 
    if m == n: 
     i = m 
    elif (m == 1 and n == 2) or (m == 2 and n == 1): 
     i = 3 
    elif (m == 0 and n == 2) or (m == 2 and n == 0): 
     i = 4 
    elif (m == 0 and n == 1) or (m == 1 and n == 0): 
     i = 5  
    return i 

c=np.zeros((3,3,3,3)) 
for m in range(3): 
    for n in range(3): 
     for o in range(3): 
      for p in range(3): 
       i = long2short(m, n) 
       j = long2short(o, p) 
       c[m, n, o, p] = C[i, j] 

を使用して、4ランクのテンソルでそれを書き直すと、私は基準座標を変更したいです私が定義した回転行列を使ってテンソルのシステムを計算します。

Q=np.array([[sqrt(2.0/3), 0, 1.0/sqrt(3)], [-1.0/sqrt(6), 1.0/sqrt(2), 1.0/sqrt(3)], [-1.0/sqrt(6), -1.0/sqrt(2), 1.0/sqrt(3)]])   
Qt = Q.transpose() 

matri

In [157]: np.dot(Q, Qt) 
Out[157]: 
array([[ 1.00000000e+00, 4.28259858e-17, 4.28259858e-17], 
     [ 4.28259858e-17, 1.00000000e+00, 2.24240114e-16], 
     [ 4.28259858e-17, 2.24240114e-16, 1.00000000e+00]]) 

しかし、なぜ、私が実行した場合:xが(数値精度が完璧ではありませんalthought)直交する

In [158]: a=np.dot(Q,Qt) 
In [159]: c_mat=np.dot(a, c) 
In [160]: a1 = np.dot(Qt, c) 
In [161]: c_mat1=np.dot(Q, a1) 

は、私がc_matための期待値(= C)ではなくc_mat1のためのですか?多次元配列にドットを使用するいくつかの細分性はありますか?

+0

c_mat1の結果はどうなっていますか?これらのケースの中にはテンソルードを使うべきでしょうか? – usethedeathstar

+3

'numpy.tensordot()'を見てください –

答えて

10

問題は多次元配列のためnp.dot(a,b)bの最後から2番目の次元でaの最後の次元の内積を作ることです:

np.dot(a,b) == np.tensordot(a, b, axes=([-1],[2])) 

ご覧のとおり、それはように動作しません。多次元配列に対する行列乗算。 np.tensordot()を使用すると、ドットプロダクトを実行する各入力からaxesを制御することができます。行列の乗算のような挙動を強制され

c_mat1 = np.tensordot(Q, a1, axes=([-1],[0])) 

:たとえば、あなたが行うことができますc_mat1で同じ結果を取得します。

+0

ヒントのおかげで!今はうまくいく! –