Python Numpy矩阵乘法使用循环将多个矩阵相乘在一起
我编写的代码创建了名为Python Numpy矩阵乘法使用循环将多个矩阵相乘在一起,python,python-3.x,numpy,loops,matrix,Python,Python 3.x,Numpy,Loops,Matrix,我编写的代码创建了名为matrixi的矩阵,其中I替换为当前循环编号: for i in range(len(node2)): if sOrP[i] == 'S': #print('series connection') matrixTemplate = numpy.array([[1.0, 0.0], [0.0, 1.0]]) #Got to put 1.0 else it doesnt work matrixTemplate[0][1
matrixi
的矩阵,其中I
替换为当前循环编号:
for i in range(len(node2)):
if sOrP[i] == 'S':
#print('series connection')
matrixTemplate = numpy.array([[1.0, 0.0], [0.0, 1.0]]) #Got to put 1.0 else it doesnt work
matrixTemplate[0][1] = frequenciesList[0][i]
globals()['matrix%s' % i] = matrixTemplate
#print(matrixTemplate)
elif sOrP[i] == 'P':
#print('parallel connection')
matrixTemplate = numpy.array([[1.0, 0.0], [0.0, 1.0]])
matrixTemplate[1][0] = 1 / frequenciesList[0][i]
globals()['matrix%s' % i] = matrixTemplate
#print(matrixTemplate)
然后我需要将创建的矩阵相乘:
Ty = matrix0 @ matrix1 @ matrix2 @ matrix3 @ matrix4 @ matrix5 @ matrix6 @ matrix7 @ matrix8 @ matrix9
这是可行的,但代码必须能够接受多个输入,并且可能创建更多或更少的矩阵。如果那样的话,那就行不通了
是否可以使用循环或函数执行乘法部分?您可以使用列表(或字典)保存矩阵:
matrices = []
for i in range(len(node2)):
if (sOrP[i] == 'S'):
#print('series connection')
matrixTemplate = numpy.array([[1.0, 0.0],[0.0, 1.0]]) #Got to put 1.0 else it doesnt work
matrixTemplate[0][1] = frequenciesList[0][i]
matrices.append(matrixTemplate)
#print(matrixTemplate)
elif (sOrP[i] == 'P'):
#print('parallel connection')
matrixTemplate = numpy.array([[1.0, 0.0],[0.0, 1.0]])
matrixTemplate[1][0] = 1/frequenciesList[0][i]
matrices.append(matrixTemplate)
#print(matrixTemplate)
然后使用reduce
和numpy.matmul
计算总矩阵积:
from functools import reduce
Ty = reduce(numpy.matmul, matrices)
您可以使用循环或numpy函数 循环实现:
matrixes = [M1, M2, ..., Mn]
A = matrixes[0]
for i in range(1, len(matrixes)):
B = matrixes[i]
A = np.dot(A, B)
第一次迭代:A=M1,B=M2;M1.M2
第二次迭代:A=M1.M2,B=M3;M1.M2.M3
Numpy函数:
Numpy.linalg.multi_-dot(矩阵)
如果您已经意识到,设置您已经完成的变量是一种非常糟糕的方法。如果你的矩阵都是正方形的,你只需要一个变量来保存整个堆栈,shaped(len(node2),2,2)
另一点是索引。Numpy数组不是列表。您的索引应该看起来像[1,0]
,而不是[1][0]
。像下面这样的答案解释了原因:
让我们假设sOrP
和frequenciesList
是numpy数组。如果它们不是,则将它们包装在对np.array
的调用中。可以将堆栈设置为如下所示:
matrix=np.broadcast_to([[1,0],[0,1]],(len(node2),2,2)).copy()
遮罩=(sOrP='S')
maskP=(sOrP='P')
矩阵[掩码,0,1]=频率列表[掩码]
矩阵[maskP,1,0]=1/频率列表[maskP]
您可以验证矩阵[i]
是否与原始构造中的matrixi
等效
将所有矩阵相乘的简单方法是使用循环:
Ty = np.eye(2)
for mat in matrices:
Ty @= mat
但是numpy是关于矢量化的。碰巧的是,为了优化这一精确操作:
Ty = np.linalg.multidot(matrices)
顺便说一句,
np.linalg.multi_dot
的思考方式与dzang所描述的完全相同,但是使用了np.dot
而不是np.matmul
。如果你想知道dot和matmul之间的区别,你可以看看这个。