python - Numpy:向量矩阵,反转
问题描述
我有一个维度为 N x N 的矩阵 A,每个矩阵元素都是一个大小为 M 的向量。我想对 A 矩阵求逆。换句话说,我想计算 A^-1,它是由大小为 M 的 NxN 个向量组成的倒 A 矩阵。
这是实现我想做的代码,我只是计算 M 次逆矩阵来计算 C = A^-1 x B,然后我正在检查 A x C = B。但每次我迭代对A、B元素的M个元素做矩阵求逆。我很确定我的代码可以满足我的需要,但不是以一种聪明的方式...
a = np.array([[[3, 4, 8], [1,8,3]],
[[2, 1, 2], [6, 5, 0]]])
b = np.array([[2, 0, 6],
[5, 2, 5]])
c = []
# compute c = a^-1 x b
for i in range(a.shape[-1]):
c.append(np.linalg.inv(a[:,:,i])@b[:,i])
c = np.asarray(c)
# check inversion compute a x c and checks a x c = b
for i in range(a.shape[-1]):
if not np.allclose(a[:,:,i]@c[i,:], b[:,i]):
raise Exception('Inversion ko')
break
print('inversion ok')
我需要矩阵运算和元素运算的混合。但我不喜欢我的实现。我是一个非常简单的实现,存在的代码更少。让我知道你的建议。
解决方案
将最后一个轴推到前面后,我们可以np.linalg.inv
在 3D 阵列上使用。a
然后,我们可以利用einsum
矢量化方式的最终输出 -
p = np.linalg.inv(a.transpose(2,0,1))
c = np.einsum('ijk,kli->ij',p,b)[...,None]
获得最终输出的更简单的替代方法c
是np.matmul/@-operator
-
c = p@b.transpose(2,0,1)
因此,整个过程可以转换为单行 -
c = np.linalg.inv(a.transpose(2,0,1))@b.transpose(2,0,1)
推荐阅读
- pandas - 具有字符串值的两个数据帧的逻辑“或”
- java - 用于从本地数据库获取代码的两因素身份验证脚本
- php - 如何使用 axios、vuejs 和 php 只获取这个值?
- resharper - 如何在 VS 上以相同的方式执行 alt+enter
- python - 打印不符合正则表达式条件或特定条件的某些数据帧行
- python - 在熊猫数据框中将 YYYYMXX 转换为日期
- wpf - IIS 托管 WCF 服务,对 WPF 客户端使用仅 HTTPS 和 Windows 身份验证
- flutter - Flutter 检查 DateTime 是否确实存在
- android - 适用于 Android 11+ 的可移动 micro-sd 卡上的文件的 ContentProvider
- c# - Html.BeginForm (ASP.NET MVC) 的问题