如何将Python中第二个矩阵中每列的矩阵中的每一行乘以?

时间:2013-03-27 17:01:23

标签: python matrix row multiplication

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

步骤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)

4 个答案:

答案 0 :(得分: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))

答案 1 :(得分:1)

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

对于C = A.B,您需要

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

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

答案 2 :(得分:1)

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的列。

答案 3 :(得分:0)

这是一个成功的例子:

>>> 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]