2013-06-02 28 views
0

E.g.Numpy,如何將2D數組轉換爲3D(通過將cols分組到2列表)

之前轉換

array([[0, 0, 0], 
     [0, 1, 1], 
     [1, 0, 1], 
     [1, 1, 0]]) 

轉換

array([[[0, 0], [0]], 
     [[0, 1], [1]], 
     [[1, 0], [1]], 
     [[1, 1], [0]]]) 

我做到了通過循環行和切片的每一行(例如,[0,0,0])到2名列表(後例如[[ 0,0],[0]])。任何numpy風格的快捷方式?

+0

注意你的第二個陣列不再'dtype = np.int',因爲你的列大小不均勻,它變成'dtype = object',是你想要的嗎? – jamylak

+0

@jamylak是的,你是對的,第二類的dtype是對象,它在我的程序中沒有錯誤,但我也對它的dtype感到困惑。這個結構基本上是我想要的,雖然 – bayesrule

+3

你是否真的需要它成爲這樣的對象還是可能的替代解決方案?例如,看看切片(假設'x'是你的數組):'x [:,0:2],x [:,2]' – Wolph

回答

1

你可以做花哨numpy的索引我想:

>>> a=np.arange(12).reshape(4,3) 
>>> a 
array([[ 0, 1, 2], 
     [ 3, 4, 5], 
     [ 6, 7, 8], 
     [ 9, 10, 11]]) 
>>> b=np.array([a[:,0:2].tolist(),a[:,2:3].tolist()]) 
>>> b 
array([[[0, 1], [3, 4], [6, 7], [9, 10]], 
     [[2], [5], [8], [11]]], dtype=object) 
>>> b[0][0][0],b[0][0][1],b[1][0][0] 
(0, 1, 2) 

添加的.tolist()將使a副本。

或者,如果你想裏面b的對象保持到a參考或視圖:

>>> b=np.array([a[:,0:2],a[:,2:3]]) 
>>> b 
array([[[0 1], [3 4], [6 7], [ 9 10]], 
     [[2], [5], [8], [11]]], dtype=object) 
>>> b[0][0][0],b[0][0][1],b[1][0][0] 
(0, 1, 2) 

然後當a確實b將改變:

>>> a[0][0]=23 
>>> a 
array([[23, 1, 2], 
     [ 3, 4, 5], 
     [ 6, 7, 8], 
     [ 9, 10, 11]]) 
>>> b 
array([[[23 1], [3 4], [6 7], [ 9 10]], 
     [[2], [5], [8], [11]]], dtype=object) 
>>> b[0][0].flags['OWNDATA'] 
False 
相關問題