在3D矩阵上广播linalg.pinv

时间:2015-12-03 18:43:24

标签: python numpy matrix linear-algebra matrix-inverse

在下面的例子中,有一个大小为(3d,3,3)的3d矩阵。如何在numpy中没有循环的情况下计算这些3 * 3矩阵中的4个的pinv?

dt = np.dtype(np.float32)

a=[[[12,3,1],
   [2,4,1],
   [2,4,2],],
   [[12,3,3],
   [2,4,4],
   [2,4,5],],
   [[12,3,6],
   [2,4,5],
   [2,4,4],],
   [[12,3,3],
   [2,4,5],
   [2,4,6]]]

a=np.asarray(a,dtype=dt)
print(a.shape)

apinv=np.zeros((4,3,3))
print(np.linalg.pinv(a[0,:,:]).shape)

for i in range(4):
   apinv[i,:,:]=np.linalg.pinv(a[i,:,:])

请注意,linalg.inv通过矩阵广播,如here所述:

print(np.linalg.inv(a).shape)

但对于pinv来说,它的工作方式不同。

1 个答案:

答案 0 :(得分:1)

一种解决方案是使用map和lambda函数:

apinv = map(lambda n: np.linalg.pinv(n), a)
apinv = np.asarray(apinv,dtype=dt)