2017-08-05 184 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