2017-08-05 149 views
0

可以说我有一个矩阵X (1000x10)和矩阵Y (20x10)的切片。我想有效地添加到YX(20x10)块反复(因此50个块)。有没有一种有效的方式来做到这一点与numpy?我不想用np.repeat为原矩阵是巨大的,我想阻止的Y不必要的重复。有任何想法吗?NumPy的添加矩阵到另一个矩阵

回答

2

您可以利用argument list unpackingNumPy broadcastingthe fact that ndarray.reshape() returns a view来执行操作:

tmp = X.reshape(-1, *Y.shape) 
tmp += Y 

无需额外的数据将被分配这些操作后,X将包含操作的结果。

+1

不同的是,计算'X.reshape()+ Y'分配并创建新的数组,而'TMP + = Y'修改已经分配的值。没有额外的RAM被分配。输出的形状是正确的,因为'X'永远不会改变它的形状。 –

+0

明白了。谢谢。 –

+0

哇!这对我来说很神奇!它是如何工作的?你能解释什么是'* Y.形状'?为什么'X.reshape(-1,* Y.shape)'不会将'X'复制到'tmp'? (它是否像'X'的引用)?谢谢! – Babak

0

可以使用np.tile“扩大”(更准确地,瓷砖)的较小的阵列相匹配的较大的阵列的大小,例如

x = np.zeros([1000,10]) 
y = np.ones([20,10]) 
new_x = x + np.tile(y,(50,1)) 

这将创建在内存中的临时大阵列以添加到x而是立即将其扔掉,所以它取决于你的内存容量和数组的大小,但我相信这是最有效的为CPU使用率和可读性方面。

另一种选择当然是循环播放较大的数组,并将较小的数组广播到它的每一部分(在这种情况下是50次),但它将会耗费更多的时间和CPU的效率,但会记忆力更轻。

第二个选项的一个例子:

for i in range(0,len(x),20): 
    x[i:i+20,:] = y