我尝试做两个3D numpy数组的点积。 假设我有一个带有形状(2,3,2)的数组 x ,其值如下:
array([[[0, 0],
[1, 1],
[1, 1]],
[[1, 0],
[0, 1],
[1, 1]]])
我有另一个3D阵列 y ,形状为(2,2,3),值为:
array([[[0, 0, 0],
[1, 0, 1]],
[[0, 1, 1],
[1, 1, 1]]])
现在我想在最后两个轴上做 x 和 y 的点积。 我的意思是我想生成
的结果x[0].dot(y[0])
x[1].dot(y[1])
有没有简单的方法来做到这一点?我已经尝试使用 x.dot(y),但是,它没有用。 谢谢!
答案 0 :(得分:5)
在NumPy 1.10及以上,这是
np.matmul(x, y)
如果你至少使用NumPy 1.10和Python 3.5,这也可以写成
x @ y
答案 1 :(得分:3)
我还没有使用tensordot
和einsum
一样多。我的第一次尝试计算了太多的值,但我可以过滤掉这些值:
In [388]: np.tensordot(x,y,(2,1))[[0,1],:,[0,1]]
Out[388]:
array([[[0, 0, 0],
[1, 0, 1],
[1, 0, 1]],
[[0, 1, 1],
[1, 1, 1],
[1, 2, 2]]])
来想一想,tensordot
与np.dot(x,y)
相同,产生一个(2,3,2,3)数组。
In [389]: np.einsum('ijk,ikm->ijm',x,y)
Out[389]:
array([[[0, 0, 0],
[1, 0, 1],
[1, 0, 1]],
[[0, 1, 1],
[1, 1, 1],
[1, 2, 2]]])
In [394]: x@y
Out[394]:
array([[[0, 0, 0],
[1, 0, 1],
[1, 0, 1]],
[[0, 1, 1],
[1, 1, 1],
[1, 2, 2]]])
在einsum
条款中dot
生成:
np.einsum('ijk,okm->ijom',x,y)
然后我们必须删除i!=o
的案例。
答案 2 :(得分:0)
如果您想使用Theano:
import theano
x = np.array([[[0,0],[1,1],[1,1]], [[1,0],[0,1],[1,1]]])
y = np.array([[[0,0,0], [1,0,1]], [[0,1,1], [1,1,1]]])
res1 = theano.tensor.dot(x[0], y[0])
res2 = theano.tensor.dot(x[1], y[1])
输出:
In [36]: res1.eval()
Out[36]:
array([[0, 0, 0],
[1, 0, 1],
[1, 0, 1]])
In [37]: res2.eval()
Out[37]:
array([[0, 1, 1],
[1, 1, 1],
[1, 2, 2]])