2015-12-27 55 views
3

應該有把一個列表這樣的方式:如何使用NumPy從列表創建多維數組?

a = [[1], [2], [3], [4], [5]] 
b = [[6], [7], [8], [9], [10]] 

到這樣的事情:

c = [[1, 6], [2, 7], [3, 8], [4, 9], [5, 10]] 

現在,我完成這個使用for循環。

c = [] 
for pos in range(len(a)): 
    c.append([a[pos], b[pos]]) 

反正for循環很慢,而不是聽起來像電視購物,但也一定是一個更好的辦法!

回答

5

的一種方式是使用column_stack

>>> np.column_stack((a, b)) 
array([[ 1, 6], 
     [ 2, 7], 
     [ 3, 8], 
     [ 4, 9], 
     [ 5, 10]]) 

column_stack脅迫的列表,以陣列的第一和返回一個數組。

由於ab都是單個元素列表的列表,當它們被強制轉換爲數組時,它們都變成了2D列向量。因爲這個事實,你也可以使用hstackconcatenate來實現同樣的事情(它們也強制列表到我們想要的具有正確形狀的數組)。使用np.hstack((a, b))np.concatenate((a, b), axis=1)

爲了完整性,也可以通過編寫np.c_[a, b]來使用np.c_。其他方法更直接,可能更快。

2

非numpy的解決方案是

In [10]: zip(a,b) 
Out[10]: [([1], [6]), ([2], [7]), ([3], [8]), ([4], [9]), ([5], [10])] 

很抱歉 - 不完全是。如果沒有內部支架,zip確實重組名單的一個很好的工作:

In [11]: zip([1,2,3],[4,5,6]) 
Out[11]: [(1, 4), (2, 5), (3, 6)] 

周圍玩多一點,我得到

In [12]: zip(zip(*a)[0],zip(*b)[0]) 
Out[12]: [(1, 6), (2, 7), (3, 8), (4, 9), (5, 10)] 

我也列表內涵的忠實粉絲。它們是循環的一種形式,但是使用普通的Python可以儘可能快地實現緊湊和儘可能快的速度。這裏我也需要[0]從內部列表中抽取條件。

In [25]: [[i[0],j[0]] for i,j in zip(a,b)] 
Out[25]: [[1, 6], [2, 7], [3, 8], [4, 9], [5, 10]] 

itertools.chain是扁平化嵌套列表另一個很好的工具:

In [31]: zip(*(itertools.chain(*a),itertools.chain(*b))) 
Out[31]: [(1, 6), (2, 7), (3, 8), (4, 9), (5, 10)] 

但既然你提到numpy我們可以使用:

In [18]: np.concatenate((a,b),axis=1) 
Out[18]: 
array([[ 1, 6], 
     [ 2, 7], 
     [ 3, 8], 
     [ 4, 9], 
     [ 5, 10]]) 

基本concatenate作品,因爲np.array(a)產生(5,1)陣列。所以2個這樣的陣列可以連接成一個(5,2)陣列,而無需進一步的形狀調整。

要回到嵌套列表格式,請在該數組上使用tolist

In [19]: np.concatenate((a,b),axis=1).tolist() 
Out[19]: [[1, 6], [2, 7], [3, 8], [4, 9], [5, 10]] 

hstackcolumn_stack還加入在1軸,如果需要,調整尺寸。但我喜歡np.concatenate給出(並要求)的明確控制。