沿第三轴的点积
Dot product along third axis
我正在尝试使用 tensordot
在 numpy 中获取张量点积,但我不确定应该如何重塑我的数组以实现我的计算。 (总的来说,我对张量的数学还很陌生。)
我有
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]
我想对 axis=2
进行点积,这样我就有了矩阵
array([[3, 0, 6],
[0, 12, 0]])
正确的 numpy 语法是什么? np.tensordot(arr, [1, 1, 1], axes=2)
好像要加一个 ValueError
.
arr
和 w
的 axis=2
减少。因此,对于 np.tensordot
,解决方案将是 -
np.tensordot(arr,w,axes=([2],[0]))
或者,也可以使用 np.einsum
-
np.einsum('ijk,k->ij',arr,w)
np.matmul
也有效
np.matmul(arr, w)
运行时测试 -
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
hlin117 在 Macbook Pro 上测试 OS X El Capitan,numpy 版本 1.10.4.
使用 .dot
对我来说效果很好:
>>> import numpy as np
>>> arr = np.array([[[1, 1, 1],
[0, 0, 0],
[2, 2, 2]],
[[0, 0, 0],
[4, 4, 4],
[0, 0, 0]]])
>>> arr.dot([1, 1, 1])
array([[ 3, 0, 6],
[ 0, 12, 0]])
尽管有趣的是比所有其他建议都慢
我正在尝试使用 tensordot
在 numpy 中获取张量点积,但我不确定应该如何重塑我的数组以实现我的计算。 (总的来说,我对张量的数学还很陌生。)
我有
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]
我想对 axis=2
进行点积,这样我就有了矩阵
array([[3, 0, 6],
[0, 12, 0]])
正确的 numpy 语法是什么? np.tensordot(arr, [1, 1, 1], axes=2)
好像要加一个 ValueError
.
arr
和 w
的 axis=2
减少。因此,对于 np.tensordot
,解决方案将是 -
np.tensordot(arr,w,axes=([2],[0]))
或者,也可以使用 np.einsum
-
np.einsum('ijk,k->ij',arr,w)
np.matmul
也有效
np.matmul(arr, w)
运行时测试 -
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
hlin117 在 Macbook Pro 上测试 OS X El Capitan,numpy 版本 1.10.4.
使用 .dot
对我来说效果很好:
>>> import numpy as np
>>> arr = np.array([[[1, 1, 1],
[0, 0, 0],
[2, 2, 2]],
[[0, 0, 0],
[4, 4, 4],
[0, 0, 0]]])
>>> arr.dot([1, 1, 1])
array([[ 3, 0, 6],
[ 0, 12, 0]])
尽管有趣的是比所有其他建议都慢