Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中,如何将矩阵中的每一行乘以第二个矩阵中的每一列?_Python_Matrix_Row_Multiplication - Fatal编程技术网

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

在Python中,如何将矩阵中的每一行乘以第二个矩阵中的每一列?,python,matrix,row,multiplication,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])

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

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

如果您坚持使用列表来完成此任务

对于C=A.B,您需要

C{ij}=sumA{ik}*B{kj}


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

如果您坚持为此使用列表

对于C=A.B,您需要

C{ij}=sumA{ik}*B{kj}


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

您可能应该使用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))

您可能应该使用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))

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:


这可能对您有用,因为它允许您轻松地循环B的列。

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:


这可能对您有用,因为它允许您轻松地循环浏览B的列。

下面是一个已解决的示例:

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

下面是一个已解决的示例:

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

你为什么不使用numpy是有原因的吗?@immerr是的,我想不用numpy先学习它。你为什么不使用numpy是有原因的吗?@immerr是的,我想不用numpy先学习它。我认为原始代码在内部列表中有列,所以你需要先压缩*a,我认为原始代码在内部列表中有列,所以您需要先压缩*A,否则您将执行逐列乘法,而不是逐列乘法。