Numpy张量:沿第三轴的点积

hli*_*117 11 python numpy dot-product tensor

请原谅我可能是一个简单的问题,但是我正在尝试使用numpy中的张量点产品tensordot,但我不确定如何重塑我的数组以实现我的计算.(总的来说,我对张量的数学还很陌生.)

我有

arr = np.array([[[1, 1, 1],
                [0, 0, 0],
                [2, 2, 2]],

               [[0, 0, 0],
                [4, 4, 4],
                [0, 0, 0]]])

w = [1, 1, 1]
Run Code Online (Sandbox Code Playgroud)

我想要一个点积axis=2,这样我就有了矩阵

array([[3, 0, 6],
       [0, 12, 0]])
Run Code Online (Sandbox Code Playgroud)

什么是适当的numpy语法?np.tensordot(arr, [1, 1, 1], axes=2)似乎提出了一个ValueError.

Div*_*kar 13

减少是axis=2为了arraxis=0w.因此,np.tensordot解决方案是 -

np.tensordot(arr,w,axes=([2],[0]))
Run Code Online (Sandbox Code Playgroud)

或者,也可以使用np.einsum-

np.einsum('ijk,k->ij',arr,w)
Run Code Online (Sandbox Code Playgroud)

np.matmul 也有效

np.matmul(arr, w)
Run Code Online (Sandbox Code Playgroud)

运行时测试 -

In [52]: arr = np.random.rand(200,300,300)

In [53]: w = np.random.rand(300)

In [54]: %timeit np.tensordot(arr,w,axes=([2],[0]))
100 loops, best of 3: 8.75 ms per loop

In [55]: %timeit np.einsum('ijk,k->ij',arr,w)
100 loops, best of 3: 9.78 ms per loop

In [56]: %timeit np.matmul(arr, w)
100 loops, best of 3: 9.72 ms per loop
Run Code Online (Sandbox Code Playgroud)

hlin117在Macbook Pro OS X El Capitan上测试,numpy版本1.10.4.