【问题标题】:How to compute the dot product of every row of two different matrices fast using numpy in Python如何在 Python 中使用 numpy 快速计算两个不同矩阵的每一行的点积
【发布时间】:2021-03-05 01:36:21
【问题描述】:

假设我有两个矩阵,我想取第一个矩阵的行,将其转置并将@应用于第二个矩阵的对应行以获得一个矩阵。对每个中的行数执行此操作。例如:

矩阵 A = N x p

矩阵 B = N x q

操作后我有 N (p x q) 个矩阵

一个例子来说明第一行。

>>> x
array([[2, 1, 2],
       [4, 3, 1],
       [1, 2, 3],
       [1, 2, 1]])

>>> g
array([[2, 3],
        [3, 3],
        [1, 2],
        [2, 5]])

第一次手术后:

>>> x[0,:,np.newaxis] @ g[np.newaxis,0,:]
array([[4, 6],
       [2, 3],
       [4, 6]])

第二次手术后:

>>> x[1,:,np.newaxis] @ g[np.newaxis,1,:]
array([[12, 12],
       [ 9,  9],
       [ 3,  3]])

以此类推,N 次返回 N (p x q) 个矩阵(这里是 3 (3x2) 个矩阵)。如何在没有循环的 Numpy 中做到这一点?

【问题讨论】:

    标签: python numpy vectorization


    【解决方案1】:
    In [17]: x = np.array([[2, 1, 2],
        ...:        [4, 3, 1],
        ...:        [1, 2, 3],
        ...:        [1, 2, 1]])
        ...: g = np.array([[2, 3],
        ...:         [3, 3],
        ...:         [1, 2],
        ...:         [2, 5]])
    In [18]: x.shape
    Out[18]: (4, 3)
    In [19]: g.shape
    Out[19]: (4, 2)
    

    通过广播,将 (4,3,1) 与 (4,1,2) 相乘以产生 (4,3,2):

    In [20]: x[:,:,None]*g[:,None,:]
    Out[20]: 
    array([[[ 4,  6],
            [ 2,  3],
            [ 4,  6]],
    
           [[12, 12],
            [ 9,  9],
            [ 3,  3]],
    
           [[ 1,  2],
            [ 2,  4],
            [ 3,  6]],
    
           [[ 2,  5],
            [ 4, 10],
            [ 2,  5]]])
    In [21]: _.shape
    Out[21]: (4, 3, 2)
    

    x[:,:,None]@g[:,None,:] 做同样的事情,在共享大小 1 维度上做积和。

    【讨论】:

    • 对于更高维度的广播,我不太了解。您怎么知道 (4,3,1) 与 (4,1,2) 相乘会产生 (4,3,2)?
    【解决方案2】:

    你可以试试这个:

    np.split(np.repeat(x.T, g.shape[1], axis=1) * g.ravel(), g.shape[0], axis=1)
    

    它给出:

    [array([[4, 6],
            [2, 3],
            [4, 6]]),
     array([[12, 12],
            [ 9,  9],
            [ 3,  3]]),
     array([[1, 2],
            [2, 4],
            [3, 6]]),
     array([[ 2,  5],
            [ 4, 10],
            [ 2,  5]])]
    

    【讨论】:

      猜你喜欢
      • 2017-03-29
      • 2012-02-07
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-02
      • 2022-01-13
      • 2014-05-09
      相关资源
      最近更新 更多