准备numpy数组--类似于广播

4zcjmb1e  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(122)

假设我有一个m维矩阵M和一个长度为n的数组N
M的形状是(a,B,n,e,f),这意味着在特定的轴(这里是2)上,M的维数与N的维数一致。
如果我想把它们相乘,在这种情况下,我会这样做:

M * N[None, None, :, None, None]

字符串
如何将这个概念推广到M的形状不同并且轴可能不同的情况?我确信必须有一个方便的函数来相应地扩展数组N,但我找不到任何东西

xfyts7mz

xfyts7mz1#

我会说明几种方法

In [29]: a,b,n,e,f = 2,3,4,5,6
In [30]: M=np.ones((a,b,n,e,f)); N=np.arange(n)

字符串
N可以用None展开;只需要尾随的;前导的是隐式的

In [31]: (M*N[:,None,None]).shape
Out[31]: (2, 3, 4, 5, 6)


我们可以使用如下内容创建一个索引元组:

In [32]: idx = [None]*M.ndim;idx
Out[32]: [None, None, None, None, None]    
In [33]: idx[2]=slice(None)

In [34]: (M*N[tuple(idx)]).shape
Out[34]: (2, 3, 4, 5, 6)


或者我们可以重新整形N,添加所需的尾随尺寸1维:

In [35]: shp = [1]*M.ndim; shp[2]=N.shape[0]
In [36]: (M*N.reshape(shp)).shape
Out[36]: (2, 3, 4, 5, 6)


或者使用expand_dims,它在盖子下面使用reshape。从ndim和所需的插入尺寸中获得(1,2)

In [37]: N1=np.expand_dims(N,(1,2)); N1.shape
Out[37]: (4, 1, 1)    
In [38]: (M*N1).shape
Out[38]: (2, 3, 4, 5, 6)

相关问题