Python 三维矩阵的numpy点是如何工作的

Python 三维矩阵的numpy点是如何工作的,python,python-3.x,numpy,Python,Python 3.x,Numpy,numpy.dot如何用于三维阵列 我有: 形状为[15,30,500]的A B带形状[15] 之后: C = np.dot(a.T, B) 我收到了带有[500,30]形状的C,但不明白如何(我想在没有numpy的情况下将代码移植到其他语言) 谢谢。由于这似乎是其他人编写的代码,并且您希望了解此案例的作用(特别是,而不是一般意义上的),出于移植的目的,我将使用一个简单的演示: In [46]: A = np.arange(24).reshape(2,3,4); B = np.array(

numpy.dot如何用于三维阵列

我有:

  • 形状为[15,30,500]的A
  • B带形状[15]
之后:

C = np.dot(a.T, B)
我收到了带有[500,30]形状的C,但不明白如何(我想在没有numpy的情况下将代码移植到其他语言)


谢谢。

由于这似乎是其他人编写的代码,并且您希望了解此案例的作用(特别是,而不是一般意义上的),出于移植的目的,我将使用一个简单的演示:

In [46]: A = np.arange(24).reshape(2,3,4); B = np.array([10,20])                                       
In [47]: A                                                                                             
Out[47]: 
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])
In [48]: A.T                                                                                           
Out[48]: 
array([[[ 0, 12],
        [ 4, 16],
        [ 8, 20]],

       [[ 1, 13],
        [ 5, 17],
        [ 9, 21]],

       [[ 2, 14],
        [ 6, 18],
        [10, 22]],

       [[ 3, 15],
        [ 7, 19],
        [11, 23]]])

In [50]: C = np.dot(A.T, B)                                                                            
In [51]: C                                                                                             
Out[51]: 
array([[240, 360, 480],
       [270, 390, 510],
       [300, 420, 540],
       [330, 450, 570]])
同样的事情,但使用广播、元素乘法和求和:

In [52]: (A.T * B[None,None,:]).sum(axis=2)                                                            
Out[52]: 
array([[240, 360, 480],
       [270, 390, 510],
       [300, 420, 540],
       [330, 450, 570]])
或者使用索引符号
einsum

In [53]: np.einsum('ijk,i->kj',A,B)                                                                    
Out[53]: 
array([[240, 360, 480],
       [270, 390, 510],
       [300, 420, 540],
       [330, 450, 570]])
元素乘法的中间步骤:

In [54]: (A.T * B[None,None,:])                                                                        
Out[54]: 
array([[[  0, 240],
        [ 40, 320],
        [ 80, 400]],

       [[ 10, 260],
        [ 50, 340],
        [ 90, 420]],

       [[ 20, 280],
        [ 60, 360],
        [100, 440]],

       [[ 30, 300],
        [ 70, 380],
        [110, 460]]])

所以它是用
B
a.T
(最后一个维度)的每一行做点积(标量积)。所以前两个维度有一个值(这里是(4,3))。

这太棒了!非常感谢你。