【问题标题】:How to multiply each row in a matrix by each column in the second matrix in Python?如何将矩阵中的每一行乘以Python中第二个矩阵中的每一列?
【发布时间】:2013-03-17 21:19:39
【问题描述】:

我知道两个矩阵相乘的步骤如下

第 1 步:确保第一个中的列数等于第二个中的行数。

第 2 步:将第一个矩阵的每一行的元素乘以第二个矩阵的每一列的元素。

第 3 步:添加产品。

第二步怎么做?

例如

A = [[3,4,5],[5,0,6],[5,7,1]]

B = [[2,1,3],[2,6,4]]

到目前为止,我有一个函数可以找到第二列的每一列

def column(B,j):
    col = []
    for column in B:
        col.append(column[j])
    return col

接下来我必须创建一个函数来查找第一行的每一行

def rows(A,i):

但是我不知道如何创建一个将它们相乘的函数

row(A,0) • col(B,0)

row(A,0) • col(B,1)

row(A,1) • col(B,0)

row(A,1) • col(B,1)

row(A,2) • col(B,0)

row(A,2) • col(B,1)

【问题讨论】:

  • 你有理由不使用 numpy 吗?
  • @immerrr 是的,我想在不先使用 numpy 的情况下学习它。

标签: python matrix row multiplication


【解决方案1】:

如果你坚持为此使用列表......

对于 C = A.B,你需要

C_{ij} = sum(A_{ik} * B_{kj})

这里,i、j 和 k 是下标,第一个下标表示行,第二个下标表示列。 i, j, k 遍历矩阵的行和列(即列表索引),因此您可以只编写 i、j 和 k 上的 for 循环。

【讨论】:

    【解决方案2】:

    您可能应该使用 numpy:

    import numpy as np
    np.dot(row(A,0), col(B,0))
    

    但是,假设您不想使用它,您可以这样做:

    def dot(arr1, arr2):
        return sum([x*y for x,y in zip(arr1, arr2)])
    
    dot(row(A,0), col(B,0))
    

    【讨论】:

      【解决方案3】:

      A 有 3 列,而 B 有 2 行。因此,您的示例似乎与步骤 1 中所述的要求相矛盾。不过,这可能与您要查找的内容接近。

      In [1]: A = [[3,4,5],[5,0,6],[5,7,1]]
      
      In [2]: B = [[2,1,3],[2,6,4]]
      
      In [3]: [[sum(r*c for r,c in zip(row, col)) for col in B] for row in A]
      Out[3]: [[25, 50], [28, 34], [20, 56]]
      

      顺便说一下,这里有一个有用的技巧,您可能会觉得很有用: 如果要转置矩阵,请使用zip(*B)

      In [4]: zip(*B)
      Out[4]: [(2, 2), (1, 6), (3, 4)]
      

      这可能对您有用,因为它可以让您轻松地遍历 B 的列。

      【讨论】:

      • 我认为原始代码在内部列表中有列,所以你需要先 zip(*A) ,否则你会做 col-by-col 而不是正确的 row-by-col 乘法.
      【解决方案4】:

      这是一个成功的例子:

      >>> from pprint import pprint
      >>> def mmul(A, B):
              nr_a, nc_a = len(A), len(A[0])
              nr_b, nc_b = len(B), len(B[0])
              if nc_a != nr_b:
                  raise ValueError('Mismatched rows and columns')
              return [[sum(A[i][k] * B[k][j] for k in range(nc_a))
                       for j in range(nc_b)] for i in range(nr_a)]
      
      >>> A = [[1, 2, 3, 4]]
      >>> B = [[1],
               [2],
               [3],
               [4]]
      
      >>> pprint(mmul(A, B))
      [[30]]
      
      >>> pprint(mmul(B, A), width=20)
      [[1, 2, 3, 4],
       [2, 4, 6, 8],
       [3, 6, 9, 12],
       [4, 8, 12, 16]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-15
        • 2014-03-03
        • 1970-01-01
        相关资源
        最近更新 更多