python – 在没有循环的3D数组中沿第三轴计算2D数组的逆

我有一个数组A,其形状是(N,N,K),我想计算另一个具有相同形状的数组B,其中B [:,:i] = np.linalg.inv(A [:,:,一世]).

作为解决方案,我看到map和for循环,但我想知道numpy是否提供了一个函数来执行此操作(我尝试过np.apply_over_axes但它似乎只能处理1D数组).

使用for循环:

B = np.zeros(shape=A.shape)
for i in range(A.shape[2]):
    B[:, :, i] = np.linalg.inv(A[:, :, i])

与地图:

B = np.asarray(map(np.linalg.inv, np.squeeze(np.dsplit(A, A.shape[2])))).transpose(1, 2, 0)
最佳答案
对于可逆矩阵M,我们有inv(M).T == inv(M.T)(逆的转置等于转置的倒数).

由于np.linalg.inv是可播放的,因此只需转置A,调用inv并转置结果即可解决问题:

B = np.linalg.inv(A.T).T

例如:

>>> N, K = 2, 3
>>> A = np.random.randint(1, 5, (N, N, K))
>>> A
array([[[4, 2, 3],
        [2, 3, 1]],

       [[3, 3, 4],
        [4, 4, 4]]])

>>> B = np.linalg.inv(A.T).T
>>> B
array([[[ 0.4  , -4.   ,  0.5  ],
        [-0.2  ,  3.   , -0.125]],

       [[-0.3  ,  3.   , -0.5  ],
        [ 0.4  , -2.   ,  0.375]]])

您可以按预期检查B的值是否与A中的数组的反转相匹配:

>>> all(np.allclose(B[:, :, i], np.linalg.inv(A[:, :, i])) for i in range(K))
True

转载注明原文:python – 在没有循环的3D数组中沿第三轴计算2D数组的逆 - 代码日志