如果不使用循环,下面代码的等效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
我需要做的是将每行“b”的“a”列分开。最后,将有4个大小为3 * 2的矩阵(大小为“a”),其中每个矩阵都是“a”除以“b”行之一。
是否可以在numpy中没有循环的情况下执行此操作?
答案 0 :(得分:3)
对于numpy解决方案,通过在数组中插入单例维度来使用数组广播:
ainvb2=a[:,:,None]/b[None,:,:]
这可以通过将a
转换为(3,2,1)
和b
来塑造(1,2,4)
来实现。然后它们可以一起广播,单身尺寸将完全符合您的需要。
或者TheBlackCat pointed out,您可以访问"所有剩余的维度"使用a
的{{1}},并且在广播期间也隐式假设了前导单身尺寸,因此您只需使用
...
与循环解决方案的比较:
ainvb2=a[...,None]/b