在没有循环的3D阵列中计算沿着第三轴的2D阵列的逆

时间:2017-01-25 11:41:06

标签: python arrays numpy vectorization linear-algebra

我有一个数组A,其形状为(N, N, K),我想计算另一个数组B,其形状与B[:, :, i] = np.linalg.inv(A[:, :, i])相同。

作为解决方案,我看到mapfor循环,但我想知道numpy是否提供了执行此操作的功能(我已尝试np.apply_over_axes但似乎它只能处理一维数组。)

带有for循环的

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

map

B = np.asarray(map(np.linalg.inv, np.squeeze(np.dsplit(A, A.shape[2])))).transpose(1, 2, 0)

1 个答案:

答案 0 :(得分:6)

对于可逆矩阵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]]])

您可以按预期检查BA中数组的反转匹配的值:

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