Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 多维数组上的点积_Python_Arrays_Numpy_Matrix - Fatal编程技术网

Python 多维数组上的点积

Python 多维数组上的点积,python,arrays,numpy,matrix,Python,Arrays,Numpy,Matrix,我对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)

我对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 [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的期望值?在多维数组上使用点有一些细微之处吗?

问题在于
np。多维数组的点(a,b)
使
a
的最后一个维度与
b
的倒数第二个维度的点积:

np.dot(a,b) == np.tensordot(a, b, axes=([-1],[2]))
如您所见,它不能作为多维数组的矩阵乘法。使用允许您从每个输入控制要执行点积的
轴。例如,要在
c_mat1
中获得相同的结果,可以执行以下操作:

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

这是一种类似矩阵乘法的行为。

对于c_mat1,你得到了什么结果?在某些情况下,我想您应该使用tensordot?请看
numpy.tensordot()
c_mat1 = np.tensordot(Q, a1, axes=([-1],[0]))