矩阵除以另一个矩阵的行,在 numpy 中没有循环

matrix divided by rows of another matrix, without a loop in numpy

以下代码在不使用循环的情况下的等效 numpy 实现是什么?

dt = np.dtype(np.float32)

a=[[12,3],
   [2,4],
   [2,4],]

b=[[12,3,2,3],
   [2,4,4,5]]

a=np.asarray(a,dtype=dt)
b=np.asarray(b,dtype=dt)
print(a.shape)
print(b.shape)
ainvb=np.zeros((3,2,4))
for i in range(4):
   ainvb[:,:,i]=a/b[:,i].T

我需要做的是将"a"的列除以"b"的每一行。最后,将有 4 个大小为 3*2("a" 大小)的矩阵,其中每个矩阵 "a" 除以 "b".

的行之一

是否可以在 numpy 中不使用循环来实现?

对于 numpy 解决方案,通过在数组中插入单一维度来使用数组广播:

 ainvb2=a[:,:,None]/b[None,:,:]

这通过将 a 转换为 (3,2,1) 并将 b 转换为 (1,2,4) 来实现。然后它们可以一起广播,单例维度将完全满足您的需求。

或如 TheBlackCat ,您可以使用 ... 访问 a 的 "all remaining dimensions",并且在广播期间也会隐式假定前导单例维度,因此您可以简单地使用

ainvb2=a[...,None]/b

与循环解决方案的比较:

In [530]: (ainvb==ainvb2).all()
Out[530]: True