Python 尝试反转二维矩阵数组时出现问题
关于矩阵4x4的求逆,我有一个简单的问题,特别是当我尝试使用Python 尝试反转二维矩阵数组时出现问题,python,numpy,matrix-inverse,Python,Numpy,Matrix Inverse,关于矩阵4x4的求逆,我有一个简单的问题,特别是当我尝试使用integ_prec索引上的循环(integ_prec=6这里和dimBlocks=4)时 以下是代码片段: # Declaration of inverse cross matrix invCrossMatrix = np.zeros((dimBlocks,dimBlocks,integ_prec,integ_prec)) # Build observables covariance matrix
integ_prec
索引上的循环(integ_prec=6
这里和dimBlocks=4
)时
以下是代码片段:
# Declaration of inverse cross matrix
invCrossMatrix = np.zeros((dimBlocks,dimBlocks,integ_prec,integ_prec))
# Build observables covariance matrix
arrayFullCross_vec = buildObsCovarianceMatrix_vec(k_ref, mu_ref, ir)
# Invert 4x4 covariance matrix
for r_p in range(integ_prec):
for s_p in range(integ_prec):
invCrossMatrix[:][:][r_p][s_p] = np.linalg.inv(arrayFullCross_vec[:][:][r_p][s_p])
函数buildobscovariacematrix\u vec
返回4D数组:
def buildObsCovarianceMatrix_vec(k_ref, mu_ref, ir):
arrayCrossTemp = np.zeros((dimBlocks,dimBlocks,integ_prec,integ_prec))
... processing
return arrayCrossTemp
但我在反转时系统地得到了一个错误:
File "GC_forecast_8bins_base_Mpc_DESI_dev.py", line 1345, in integ_LU_cross
function_A = aux_fun_LU_cross_vec(ecs, way, I1[0], I1[1], I1[2])
File "GC_forecast_8bins_base_Mpc_DESI_dev.py", line 1216, in aux_fun_LU_cross_vec
invCrossMatrix[r_p][s_p][:][:] = np.linalg.inv(arrayFullCross_vec[:][:][r_p][s_p])
File "/Users/fab/Library/Python/2.7/lib/python/site-packages/numpy/linalg/linalg.py", line 551, in inv
ainv = _umath_linalg.inv(a, signature=signature, extobj=extobj)
File "/Users/fab/Library/Python/2.7/lib/python/site-packages/numpy/linalg/linalg.py", line 97, in _raise_linalgerror_singular
raise LinAlgError("Singular matrix")
numpy.linalg.LinAlgError: Singular matrix
对于我的代码的另一个版本(使用标量值),一切正常
我希望在循环的每次迭代中反转4x4矩阵
语法是否正确一次反转所有矩阵,无需循环。如果你得到
numpy.linalg.linalgeror:Singular matrix
是因为数组中有一个或多个矩阵是奇异的(不可逆的)。你必须决定在这些情况下要做什么(或者修复生成矩阵的函数,如果这些矩阵都是可逆的)。@jdehesa不应该将arrayFullCross\u vec
重新格式化为(r\u p,s\u p,4,4)
以应用广播?啊,等等,不,问题肯定是语法,nvCrossMatrix[:][r\u p][s\p]=np linalg.inv(arrayFullCross\u vec[:][r\u p][s_p]
不正确,它可能是nvCrossMatrix[:,:,r_p,s_p]=np.linalg.inv(arrayFullCross_vec[:,:,r_p,s_p]
@brella对,我没有意识到矩阵维数是前两个,谢谢。是的,你可以做np.linalg.inv(arrayFullCross_vec.transpose(2,3,0,1))。转置(2,3,0,1)
.Bare[:]
什么都不做。你可以做np.linalg.inv(arrayFullCross\u vec)
一次反转所有矩阵,而不需要循环。如果你得到numpy.linalg.linalgeror:Singular matrix
是因为有一个或多个矩阵是奇异的(不可逆的)在你的数组中。你必须决定在这些情况下要做什么(或者修复生成矩阵的函数,如果这些矩阵都是可逆的)。@jdehesa不应该arrayFullCross\u-vec
被重塑为(r\p,s\p,4,4)
为了应用广播?啊,等等,不,问题肯定是语法,nvCrossMatrix[:][:][r_p][s_p]=np.linalg.inv(arrayFullCross_vec[:][:][r_p][s_p]
不正确,它应该是nvCrossMatrix[:,:,r_p,s_p]=np.linalg.inv
@Brella好的,我不知道矩阵维数是前两个,谢谢。是的,你可以做np.linalg.inv(arrayFullCross\u vec.transpose(2,3,0,1))。transpose(2,3,0,1)
.Bare[:]
什么都不做。