在numpy中有一种快速方法可以向矩阵的每一行或每列添加一个向量。
最近,我一直在将矢量平铺到矩阵的大小,这可能会占用大量内存。例如
mat=np.arange(15)
mat.shape=(5,3)
vec=np.ones(3)
mat+=np.tile(vec, (5,1))
我能想到的另一种方法是使用python循环,但循环很慢:
for i in xrange(len(mat)):
mat[i,:]+=vec
有没有一种快速的方法可以在numpy中执行此操作而不使用C扩展?
能够虚拟平铺矢量,就像更灵活的广播版本一样,真是太棒了。或者能够以行方式或列方式迭代操作,您可能几乎可以使用某些ufunc方法。
答案 0 :(得分:22)
为了向每一行添加1d数组,广播已经为您处理了事情:
mat += vec
但更常见的是,您可以使用np.newaxis
将数组强制转换为可广播的形式。例如:
mat + np.ones(3)[np.newaxis,:]
虽然没有必要将数组添加到每一行,但为了逐列添加,这是必要的:
mat + np.ones(5)[:,np.newaxis]
编辑:正如Sebastian所提到的,对于行添加,mat + vec
已正确处理广播。它也比使用np.newaxis
更快。我已经编辑了我原来的答案,以明确这一点。