如何在Python中正确使用numpy.linalg进行矩阵计算

如何在Python中正确使用numpy.linalg进行矩阵计算,python,numpy,matrix,matrix-inverse,Python,Numpy,Matrix,Matrix Inverse,我在Python中使用numpy.linalg.inv函数时遇到了困难。我通过从一个更大的ZMatrix获取嵌套for循环中的某些元素来填充4个矩阵。如下 #populating arrays for Zp for k1 in range(3): for m1 in range(3): Za[k1][m1] = ZMatrix[k1][m1] for k1 in range(3,4): for m1 in range(0,2): Zb[k1-3]

我在Python中使用numpy.linalg.inv函数时遇到了困难。我通过从一个更大的ZMatrix获取嵌套for循环中的某些元素来填充4个矩阵。如下

#populating arrays for Zp
for k1 in range(3):
    for m1 in range(3):
        Za[k1][m1] = ZMatrix[k1][m1]

for k1 in range(3,4):
    for m1 in range(0,2):
        Zb[k1-3][m1] = ZMatrix[k1][m1]        

for k1 in range(0,2):
    for m1 in range(3,4):
        Zc[k1][m1-3] = ZMatrix[k1][m1]

for k1 in range(3,4):
    for m1 in range(3,4):
        Zd[k1-3][m1-3] = ZMatrix[k1][m1] 
然后我想做下面的计算

ZpMatrix = Za-(Zb*np.linalg.inv(Zd)*Zc)
它抛出了一个错误:

 LinAlgError: Singular matrix
我怎样才能在没有这个错误的情况下进行我想要的计算呢


非常感谢

你不能反转Zd,因为它不是可逆的;这不是一个numpy.linalg的问题。Zd的尺寸是多少,你是如何创建的?范围3,4是[3,],所以填充Zd的循环只执行了一次;它所做的只是Zd[0][0]=ZMatrix[3][3]。顺便说一下,对于numpy矩阵和ndarray对象,您可以[而且应该]写入Zd[0,0]而不是Zd[0][0]。我正在尝试将ZMatrix划分为4个不同的矩阵,然后使用它们创建ZpMatrix。范围函数在生成的序列中不包括停止值;看见这是贯穿python和numpy的模式。您可以使用numpy数组,而不是矩阵的列表。例如,Zd=np.zeros2,2。或者更好的方法是,为ZMatrix使用一个numpy数组,然后您可以编写Zd=ZMatrix[3:,3:],这是ZMatrix的右下角,看起来您的代码正试图这样做。我建议你花些时间学习numpy教程。