2013-08-26 140 views
7

考慮下面的簡單示例:如何將1D numpy數組分配給2D numpy數組?

X = numpy.zeros([10, 4]) # 2D array 
x = numpy.arange(0,10) # 1D array 

X[:,0] = x # WORKS 

X[:,0:1] = x # returns ERROR: 
# ValueError: could not broadcast input array from shape (10) into shape (10,1) 

X[:,0:1] = (x.reshape(-1, 1)) # WORKS 

有人可以解釋爲什麼numpy的具有形狀的矢量(N,),而不是(N,1)? 從一維數組轉換爲二維數組的最佳方式是什麼?

爲什麼我需要這個? 因爲我有一個代碼插入結果x到二維數組X和x的大小隨時變化,所以我有X[:, idx1:idx2] = x如果x也是2D也可以,但如果x是1D,則不起作用。

回答

4

您是否真的需要能夠使用相同的功能處理1D和2D輸入?如果你知道的輸入將是一維,使用

X[:, i] = x 

如果你知道的輸入將是2D,使用

X[:, start:end] = x 

如果你不知道輸入的尺寸,我推薦在一行或另一行之間切換與if,雖然可能有一些索引技巧,我不知道這將處理兩個相同。

x具有形狀(N,)而不是塑造(N, 1)(或(1, N)),因爲numpy的不只是矩陣數學建。 ndarrays是n維的;它們支持任何非負數維度(包括0)的高效,一致的矢量化操作。雖然這可能偶爾會使矩陣運算稍微簡潔一些(特別是在矩陣乘法的情況下,dot),但它會爲您的數據自然是1維或3維,4維或n維時生成更通用的代碼。

0

我想你的問題已經包含了答案。 Numpy允許數組具有任何維度(而afaik Matlab在可能的情況下更喜歡兩個維度),所以您需要對此進行正確的處理(並且始終區分(n,)和(n,1))。通過給一個數字作爲索引之一(如第三行中的0),可以將維度減1。通過給出範圍作爲索引之一(如第4行中的0:1),您不會降低維度。

第3行對我來說非常合理,我將以這種方式分配給2-D數組。

0

這裏有兩個技巧,使代碼有點短。

X = numpy.zeros([10, 4]) # 2D array 
x = numpy.arange(0,10) # 1D array 
X.T[:1, :] = x 
X[:, 2:3] = x[:, None] 
+2

你能否再添加一些評論?我不清楚你是如何從原始代碼中獲得的,以及爲什麼這能解決問題。 – brandones