矩阵除以另一个矩阵的行,在 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
以下代码在不使用循环的情况下的等效 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