【问题标题】:Dot product with last two axises of two 3D arrays in numpynumpy中两个3D数组的最后两个轴的点积
【发布时间】:2016-09-06 03:42:22
【问题描述】:

我尝试做两个 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]]])

现在我想在最后两个轴上做 xy 的点积。 我的意思是我想生成的结果

x[0].dot(y[0]) 
x[1].dot(y[1])

有什么简单的方法可以做到这一点吗?我已经尝试过使用 x.dot(y),但是它没有用。 谢谢!

【问题讨论】:

    标签: arrays numpy product theano dot-product


    【解决方案1】:

    在 NumPy 1.10 及更高版本上,这是

    np.matmul(x, y)
    

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

    x @ y
    

    【讨论】:

    • np.einsum('ijk,ikm->ijm',x,y) 在旧的 numpy 上。
    • 您好,感谢您的回答,问题是现在我尝试在 theano(深度学习工具之一)中使用它,但是,theano 不支持 einsum 或 matmul,我注意到“tensordot " numpy 和 theano 都支持,但我确实知道如何解决它,你能给我一些建议吗,类似的问题在这里 link
    • @LeiHua:如果你想要一个 Theano 解决方案,你应该从一开始就要求一个。我从未使用过 Theano,而且我不熟悉它的工作原理,所以我无法为您提供帮助。
    【解决方案2】:

    我使用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]]])
    

    想想看,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的案例。

    【讨论】:

    • 谢谢你的回答,我试试看!
    【解决方案3】:

    如果您想使用 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]])
    

    【讨论】:

      猜你喜欢
      • 2020-11-27
      • 2021-04-18
      • 1970-01-01
      • 2021-02-06
      • 1970-01-01
      • 1970-01-01
      • 2021-03-02
      • 2019-11-08
      • 1970-01-01
      相关资源
      最近更新 更多