我有一个数组A
,其形状为(N, N, K)
,我想计算另一个数组B
,其形状与B[:, :, i] = np.linalg.inv(A[:, :, i])
相同。
作为解决方案,我看到map
和for
循环,但我想知道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)
答案 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]]])
您可以按预期检查B
与A
中数组的反转匹配的值:
>>> all(np.allclose(B[:, :, i], np.linalg.inv(A[:, :, i])) for i in range(K))
True