2013-02-26 79 views
4

我有許多具有公共索引的不同大小的數組。Python,Numpy,在多維空間中添加數組的方法(廣播)

例如,

Arr1 = np.arange(0, 1000, 1).reshape(100, 10) 
Arr2 = np.arange(0, 500, 1).reshape(100,5) 

Arr1.shape = (100, 10) 
Arr2.shape = (100, 5) 

我想跟你一起加入到這些新的陣列,ARR3這是三維的。例如

Arr3 = Arr1 + Arr2 
Arr3.shape = (100, 10, 5) 

請注意,在這種情況下,這些值應該是全等的。

Arr3[10, 3, 2] = Arr1[10, 3] + Arr2[10, 2] 

我一直在嘗試使用下面的方法

test = Arr1.copy() 
test = test[:, np.newaxis] + Arr2 

現在,我已經能夠將兩個方陣在一起的時候,使這項工作。

m = np.arange(0, 100, 1) 
[x, y] = np.meshgrid(x, y) 
x.shape = (100, 100) 

test44 = x.copy() 
test44 = test44[:, np.newaxis] + x 
test44.shape = (100, 100, 100) 
test44[4, 3, 2] = 4 
x[4, 2] = 2 
x[3, 2] = 2 

但是,在我的實際計劃中,我不會爲此問題提供方形矩陣。 此外,此方法的內存密集程度非常高,如下所示開始向上移動維度數時會有所體現。

test44 = test44[:, :, np.newaxis] + x 
test44.shape = (100, 100, 100, 100) 

# Note this next command will fail with a memory error on my computer. 
test44 = test44[:, :, :, np.newaxis] + x 

所以我的問題有兩個部分:

  1. 是否有可能創建從與共同的兩個不同形狀的2D陣列的3D陣列「共享」軸線。
  2. 這樣的方法可以在更高階的維度上擴展嗎?

任何援助非常感謝。

回答

4

是的,你想要做的就是所謂的廣播,如果輸入具有正確的形狀,它是由numpy自動完成的。試試這個:

Arr1 = Arr1.reshape((100, 10, 1)) 
Arr2 = Arr2.reshape((100, 1, 5)) 
Arr3 = Arr1 + Arr2 

我發現this是一個很好的介紹,廣播應該告訴你如何這種行爲擴展到N維。

+0

因此,如果我想要做一個四維廣播,比如說Arr4 = Arr1 + Arr2 + Arr3,我需要首先將它們全部重新塑造成四個維度? – 2013-02-26 00:37:17

+0

不僅僅是維度的數量,您應該弄清楚最終結果的形狀應該是什麼,並重新塑造輸入數組,以便它們可以廣播到最終形狀。例如,如果最終的形狀應該是(2,3,4,100),你可以試試:'Arr1.shape =(2,1,1,100); Arr1.shape =(1,3,1,100); Arr1.shape =(1,1,4,100)'。在這種情況下,您可以在技術上離開領先的1,但我希望將它們包含在內。 – 2013-02-26 19:28:08

+0

非常感謝知道。我已經能夠成功播出,但是現在我開始轉向更高維度時遇到了內存問題,所以我想我可能需要開發一種不太「蠻力」的方法。儘管謝謝你的幫助。 – 2013-02-26 22:19:23