【问题标题】:Efficient multiplying matrices with different shapes in numpynumpy中不同形状的高效矩阵乘法
【发布时间】:2018-08-10 12:04:32
【问题描述】:

我有两个矩阵 A 和 B:

>>>A
[[1,1,1]
[1,1,1]]
>>>B
[2, 3]

我想有效地将​​它们相乘以获得这样的结果:

>>> A*B
[[2,2,2]
[3,3,3]]

我正在寻找比循环迭代更有效的解决方案。有人可以帮忙吗?

【问题讨论】:

  • 如果B[2, 3] 怎么办?
  • 那么输出就是:[[2,2,2] [3,3,3]]
  • 那么B = [2, 3, 4]B = [2, 3, 4, 5] 怎么样?
  • 两个矩阵的行数必须相等。矩阵 A 每一列的所有值都乘以矩阵 B 同一行的值。

标签: python arrays python-3.x numpy


【解决方案1】:

您可以使用np.multiply 将元素与广播相乘:

A = np.array([[1,1,1],
              [1,1,1]])

B = np.array([2, 3])

res = np.multiply(A, B[:, None])

print(res)

array([[2, 2, 2],
       [3, 3, 3]])

【讨论】:

  • 这正是我要找的!元素乘法:) 谢谢!
【解决方案2】:

最简单的方法就是(A*B.T).T 但是习惯广播可能会更好:

A * B[:, None]

这在功能上与@jpp 对np.multiply 的回答相同,但写起来要短一些

【讨论】:

    【解决方案3】:

    让:

    >>> A = np.array([[1,1,1], #Shape = (2,3)
              [1,1,1]])
    >>> A
    Out[3]: 
        array([[1, 1, 1],
              [1, 1, 1]])
    >>>B = np.array([2, 3])  # shape = (2,)
    

    两者都有不同的形状,所以我们不能做矩阵乘法(逐元素) 所以我们可以做A.T,它将A的形状转换为(3,2)

    >>> (A.T * B).T
    Out[7]: 
           array([[2, 2, 2],
                  [3, 3, 3]])
    

    【讨论】:

      【解决方案4】:

      您的问题违反了数学规则。 矩阵 A 和 B 不能相乘,因为 A 的列数不等于 B 的行数。在这种情况下,这两个矩阵的乘法没有定义

      【讨论】:

      • 我认为他所说的“乘法”实际上是指doing something to the matrices,但他没有正确表述,所以不知道在某些情况下会发生什么。
      • 好吧,我猜
      【解决方案5】:

      将 5x3 矩阵乘以 3x2 矩阵(实数矩阵乘积)

      import numpy as np
      
      
      np_1= np.arange(15).reshape(5,3)
      
      
      np_2=np.arange(6).reshape(3,2)
      
      np.matmul(np_1,np_2)
      

      【讨论】:

        猜你喜欢
        • 2013-10-21
        • 2013-08-17
        • 2018-11-16
        • 2020-03-06
        • 2014-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多