我对Python很新,并试图创建一个函数来将向量乘以矩阵(任何列大小)。 e.g:
multiply([1,0,0,1,0,0], [[0,1],[1,1],[1,0],[1,0],[1,1],[0,1]])
[1, 1]
这是我的代码:
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的情况下完成乘法?
答案 0 :(得分:8)
Numpythonic方法:(使用numpy.dot
以获得两个矩阵的点积)
In [1]: import numpy as np
In [3]: np.dot([1,0,0,1,0,0], [[0,1],[1,1],[1,0],[1,0],[1,1],[0,1]])
Out[3]: array([1, 1])
Pythonic方法:
第二个for
循环的长度为len(v)
,您尝试根据该索引编制v
,因此您获得了索引错误。作为一种更加pythonic的方式,您可以使用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]
答案 1 :(得分:3)
我认为代码的问题在于你遍历矩阵的行而不是列。此外,你不能重置你的总数'每个向量*矩阵列计算后的变量。这就是你想要的:
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
答案 2 :(得分:2)
r
是来自G
的元素,所以它是一行只有两个元素。这意味着您无法使用索引j
从r
获取值,因为j
从0变为v
的长度,在您的示例中为6。 / p>
答案 3 :(得分:1)
我需要解决方案,其中第一个矩阵可以是二维的。从@Kasramvd扩展解决方案以接受二维first
矩阵。发表于此处供参考:
>>> 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]]
答案 4 :(得分:0)
我附加了矩阵乘法代码,请遵循一维乘法的示例格式(列表列表)
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))
结果是[[5]]
答案 5 :(得分:0)
有一个代码可以帮助您将两个矩阵相乘:
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)