Python 3:将向量与不带NumPy的矩阵相乘

Python 3:将向量与不带NumPy的矩阵相乘,python,python-3.x,numpy,matrix,vector,Python,Python 3.x,Numpy,Matrix,Vector,我是Python的新手,尝试创建一个函数,将向量乘以矩阵(任意列大小)。 e、 g: 这是我的密码: def multiply(v, G): result = [] total = 0 for i in range(len(G)): r = G[i] for j in range(len(v)): total += r[j] * v[j] result.append(total) return

我是Python的新手,尝试创建一个函数,将向量乘以矩阵(任意列大小)。 e、 g:

这是我的密码:

def multiply(v, G):
    result = []
    total = 0
    for i in range(len(G)):
        r = G[i]
        for j in range(len(v)):
            total += r[j] * v[j]
        result.append(total)
    return result  

问题是,当我尝试选择矩阵(r[j])中每列的第一行时,会显示错误“列表索引超出范围”。有没有其他不使用NumPy完成乘法的方法?

r
G
中的一个元素,因此它是一个只有两个元素的行。这意味着您不能使用索引
j
r
获取值,因为
j
从0到
v
的长度,在您的示例中为6。

数音学方法:(使用
numpy.dot
获取两个矩阵的点积)

python方法:

第二个
for
循环的长度是
len(v)
,您尝试根据该长度对
v
进行索引,因此得到了索引错误。作为一种更具python风格的方式,您可以使用
zip
函数获取列表的列,然后在列表中使用
starmap
mul

In [13]: first,second=[1,0,0,1,0,0], [[0,1],[1,1],[1,0],[1,0],[1,1],[0,1]]

In [14]: from itertools import starmap

In [15]: from operator import mul

In [16]: [sum(starmap(mul, zip(first, col))) for col in zip(*second)]
Out[16]: [1, 1]

我需要第一个矩阵可以是二维的解。从@Kasramvd扩展解决方案以接受二维
第一个
矩阵。张贴于此供参考:

>>> first,second=[[1,0,0,1,0,0],[0,1,1,1,0,0]], [[0,1],[1,1],[1,0],[1,0],[1,1],[0,1]]
>>> from itertools import starmap
>>> from operator import mul
>>> [[sum(starmap(mul, zip(row, col))) for col in zip(*second)] for row in first]
[[1, 1], [3, 1]]

我认为您的代码的问题在于循环遍历矩阵的行而不是列。此外,在每次向量*矩阵列计算之后,也不会重置“total”变量。这就是你想要的:

def multiply(v, G):
    result = []
    for i in range(len(G[0])): #this loops through columns of the matrix
        total = 0
        for j in range(len(v)): #this loops through vector coordinates & rows of matrix
            total += v[j] * G[j][i]
        result.append(total)
    return result

我附上了一个矩阵乘法的代码,请遵循一维乘法的示例格式(列表列表)


结果是[[5]]

有一个代码可以帮助你将两个矩阵相乘:


这看起来不适合初学者。@physicalattraction我将添加更多描述;)谢谢我没有遇到过zip函数,这让它变得简单多了!最后一件事,当我试图返回sum(mul(k,t))时,我收到了一个语法错误。它突出显示了外部的方括号,我假设它以列表的形式返回总和。你能解释一下为什么你的答案比其他人的好吗。@user_3pij并不比其他人好,但这是一个不使用numpy的本机代码。我想说明,我们只需使用基本的python就可以完成同样的任务
>>> first,second=[[1,0,0,1,0,0],[0,1,1,1,0,0]], [[0,1],[1,1],[1,0],[1,0],[1,1],[0,1]]
>>> from itertools import starmap
>>> from operator import mul
>>> [[sum(starmap(mul, zip(row, col))) for col in zip(*second)] for row in first]
[[1, 1], [3, 1]]
def multiply(v, G):
    result = []
    for i in range(len(G[0])): #this loops through columns of the matrix
        total = 0
        for j in range(len(v)): #this loops through vector coordinates & rows of matrix
            total += v[j] * G[j][i]
        result.append(total)
    return result
def MM(a,b):
c = []
for i in range(0,len(a)):
    temp=[]
    for j in range(0,len(b[0])):
        s = 0
        for k in range(0,len(a[0])):
            s += a[i][k]*b[k][j]
        temp.append(s)
    c.append(temp)

return c
a=[[1,2]]
b=[[1],[2]]
print(MM(a,b))
A=[[1,2,3],[4,5,6],[7,8,9]]
B=[[1,2,3],[4,5,6],[7,8,9]]
matrix=[]

def multiplicationLineColumn(line,column):
    try:
        sizeLine=len(line)
        sizeColumn=len(column)
        if(sizeLine!=sizeColumn):
            raise ValueError("Exception")
        res = sum([line[i] * column[i] for i in range(sizeLine)])
        return res
    except ValueError:
        print("sould have the same len line & column")

def  getColumn(matrix,numColumn):
    size=len(matrix)
    column= [matrix[i][numColumn] for i in range(size)]
    return column

def getLine(matrix,numLine):
    line = matrix[numLine]
    return line

for i in range(len(A)):
    matrix.append([])
    for j in range(len(B)):
        matrix[i].append(multiplicationLineColumn(getLine(A,i),getColumn(B,j)))

print(matrix)