Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.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 Numpy矩阵乘法使用循环将多个矩阵相乘在一起_Python_Python 3.x_Numpy_Loops_Matrix - Fatal编程技术网

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之间的区别,你可以看看这个。