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为了arr和axis=0为w.因此,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.