【问题标题】:function for two numpy array costume multiplication两个numpy数组服装乘法的函数
【发布时间】:2018-11-07 14:16:57
【问题描述】:

我需要一个简单的 numpy 函数来做这个乘法而不需要 for-loop 并且更省时。

其实我想要一个函数,将a的每一行乘以b

a=np.arange(2,12).reshape(5,2)
b=np.array([[1,2],[3,4]])
c=np.array([[a[i,:]@b] for i in range(a.shape[0])])

【问题讨论】:

    标签: python numpy matrix-multiplication multiplication numpy-ndarray


    【解决方案1】:

    numpy.tensordot:

    c = np.tensordot(a, b, axes=1)
    

    如果您坚持 shape 将是相同的:

    c.reshape(5,1,2)
    

    【讨论】:

    • 返回的正是我想要的
    • 这绝对是最简洁的答案,但请注意 tensordot 比使用 einsum 慢大约 10 倍(至少在我的机器上)。它似乎也比 OPs 原始方法慢一些。
    • @MattPitkin 感谢您的有趣见解。我个人仍然很难理解einsum 的工作原理。很高兴看到两个答案都出现了。
    【解决方案2】:

    使用 numpy einsum 你可以做到(根据@dobkind 的answer 编辑以重塑数组):

    c = np.einsum('ki,ij->kj', a, b).reshape(5,1,2)
    

    应该更快。

    %timeit np.einsum('ki,ij->kj', a, b).reshape(5,1,2)
    1.87 µs ± 10.5 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
    

    与(使用@ 矩阵乘法运算符,在 Python 3 中有效)

    %timeit np.array([[a[i,:]@b] for i in range(a.shape[0])])
    10.2 µs ± 36.7 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
    

    【讨论】:

    • 我采纳了你的建议,但它的答案与我想要的不一样
    • 试试 np.einsum('ki,ij->kj', a, b) - 我已经编辑了这个选项的答案。 @dobkind 的回答也有效。
    【解决方案3】:

    要使用 @,请将 a 制作成一个 3d 数组 (5,1,2),并与 (2,2) 配对(或通过自动广播 (1,2,2))。

    In [448]: np.array([[a[i,:]@b] for i in range(a.shape[0])])
    Out[448]: 
    array([[[11, 16]],
    
           [[19, 28]],
    
           [[27, 40]],
    
           [[35, 52]],
    
           [[43, 64]]])
    
    In [450]: a[:,None,:]@b
    Out[450]: 
    array([[[11, 16]],
    
           [[19, 28]],
    
           [[27, 40]],
    
           [[35, 52]],
    
           [[43, 64]]])
    

    这实际上比einsum 解决方案要快一些——尽管对于这么小的例子,我不会在时间问题上大惊小怪。

    【讨论】:

      【解决方案4】:

      使用 numpy 中的 matmul 函数将两个矩阵相乘。 让我知道这是否有帮助。谢谢。

      c = np.matmul(a,b)
      

      【讨论】:

      • 非常感谢您的合作,但这不适用于我的应用程序
      • 还有@是matmul
      猜你喜欢
      • 2015-07-03
      • 2015-11-14
      • 2022-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多