【问题标题】:Compute inverse of 2D arrays along the third axis in a 3D array without loops在没有循环的 3D 数组中沿第三轴计算 2D 数组的逆
【发布时间】:2017-06-10 13:57:19
【问题描述】:

我有一个数组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)

【问题讨论】:

    标签: python arrays numpy vectorization linear-algebra


    【解决方案1】:

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

    【讨论】:

    • 哇,我从没想到inv 是可广播的,但现在我真的想到了,为什么不呢!干得好,先生/女士!
    • 最后一条命令对我来说抛出了一个语法错误,我认为最后的方括号应该是圆括号。否则 +1
    • @Wolpertinger:谢谢你的收获!我已经修复了语法错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    • 2019-08-20
    • 2020-06-04
    • 2021-10-29
    • 2022-01-08
    • 2020-11-10
    相关资源
    最近更新 更多