5

numpy.dot 製品について疑問があります。

次のような行列 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

次に、多次元配列を使用して 4 ランクのテンソルに再キャストします

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]

そして、次のように定義した回転行列を使用して、テンソルの座標参照系を変更したいと思います。

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()

行列は直交しています (ただし、数値の精度は完全ではありません)。

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]])

しかし、なぜ私が実行した場合:

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 の期待値は得られませんか? 多次元配列でドットを使用するための微妙な点はありますか?

4

1 に答える 1

13

問題は、np.dot(a,b)多次元配列の場合、 の最後の次元と の最後aから 2 番目の次元とのドット積を作成することbです。

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

ご覧のとおり、多次元配列の行列乗算としては機能しません。を使用すると、どの入力からドット積を実行するnp.tensordot()かを制御できます。axesたとえば、同じ結果を得るには、次のようにしc_mat1ます。

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

これは、行列乗算のような動作を強制しています。

于 2013-07-18T03:58:16.250 に答える