具有numpy中两个3D阵列的最后两个轴的点积

时间:2016-09-06 03:42:23

标签: arrays numpy product theano dot-product

我尝试做两个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),但是,它没有用。 谢谢!

3 个答案:

答案 0 :(得分:5)

在NumPy 1.10及以上,这是

np.matmul(x, y)

如果你至少使用NumPy 1.10和Python 3.5,这也可以写成

x @ y

答案 1 :(得分:3)

我还没有使用tensordoteinsum一样多。我的第一次尝试计算了太多的值,但我可以过滤掉这些值:

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]]])

来想一想,tensordotnp.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]])