尝试使用python中的循环进行矩阵向量和矩阵矩阵乘法

时间:2020-08-25 12:39:08

标签: python numpy loops matrix-multiplication

这是我拥有的代码,但我不断收到错误:

import numpy as n
  

mat=n.arrary([(2,3),(4,5)])
vect=n.array([1,2])

def mat_vect_mult(mat,vect):
    
    res=n.array([0,0])
    for i in range(len(mat)):
        for j in range(len(mat[0])):
            res[i][j]+=[i][j]*vect[j]
    return res

mat1=n.arrary([(2,3),(4,5)])
mat2=n.arrary([(2,3),(4,5)])

def mat_mat_mult(mat1,mat2):
    
    res=n.array(((0,0),(0,0)))
    for i in range(len(mat1)):
            for j in range(len(mat2[0])):
                for k in range(len(mat2)):
                    res[i][j]+=mat1[i][k]*mat2[k][j]
    return res

1 个答案:

答案 0 :(得分:0)

第一个建议:导入 Numpy 导入为 np 时, 就像全世界一样。

要将数组乘以向量,请将函数定义为:

def mat_vect_mult(mat, vect):
    res = np.zeros_like(mat)
    for i in range(mat.shape[0]):
        for j in range(mat.shape[1]):
            res[i][j] += mat[i][j] * vect[j]
    return res

您的代码包含 arrary (删除最后一个 r )。 您也无法将数组名称放在 + = 之后。 我还更改了在两个循环中创建 res 和范围的方式。

然后运行mat_vect_mult(mat, vect)得到:

array([[ 2,  6],
       [ 4, 10]])

运行mat * vect可获得相同的结果( mat 中的每一行 乘以 vect )。

要大量增加两个矩阵,请将函数更改为:

def mat_mat_mult(mat1, mat2):
    res = np.zeros_like(mat)
    for i in range(mat1.shape[0]):
        for j in range(mat2.shape[1]):
            for k in range(mat1.shape[1]):
                res[i][j] += mat1[i][k] * mat2[k][j]
    return res

我更改了 res 的创建方式和所有循环的范围:

  • mat1 中的行数,
  • mat2 中的列数,
  • mat1 中的行长(也是 mat2 中的列长)。

您的代码仅适用于形状为(2,2)的数组。

然后运行:mat_mat_mult(mat1, mat2)得到:

array([[16, 21],
       [28, 37]])

与运行mat1 @ mat2相同的结果。