2016-08-23 136 views
1

這是我簡單的代碼片段Python Numpy - 附加三個陣列形成矩陣或3D陣列

一切都是一個numpy數組。我也歡迎使用列表操作。

a = [1,2,3,4,5] 
b = [3,2,2,2,8] 

c = ['test1', 'test2', 'test3','test4','test5'] 

預期成果:

d = [ 1, 2, 3, 4, 5; 
     3, 2, 2, 2, 8; 
     'test1','test2', 'test3', 'test4','test5' ] 

OR

d = [ 1 3 'test1'; 
     2 2 'test2'; 
     3 2 'test3'; 
     4 2 'test4'; 
     5 8 'test5'] 
+0

您是否有興趣在一個特定的字符串顯示,或特定的數據結構(和行爲)?有一個真正的區別。一個';'是顯示的一部分,而不是數據結構。 – hpaulj

+0

只要我可以隨時訪問數值,我就可以使用任何顯示。謝謝你或者指點分號。 –

回答

0

亞當answer使用numpy.concat也是正確的,但在條款豎直堆疊的行 - - 指定您所期待的確切形狀的,你會想看看numpy.vstack

>>> import numpy as np 
>>> np.vstack([a, b, c]) 
array([['1', '2', '3', '4', '5'], 
     ['3', '2', '2', '2', '8'], 
     ['test1', 'test2', 'test3', 'test4', 'test5']], 
     dtype='<U21') 

這裏有一個抓你做任何一種方式:因爲你的獨立陣列(int64int64<U5)全部放在一起,新陣列將自動使用最小限制類型,在這種情況下,它是unicode類型。另外:numpy.hstack

+0

你能告訴我你的意思是unicode類型是什麼意思?當我打印它們時,我將它們打印爲字符串。 –

+0

這個答案使用了Python3,其中unicode是默認的字符串類型。 – hpaulj

0

退房的concat method.

>>> a = np.array([[1, 2], [3, 4]]) 
>>> b = np.array([[5, 6]]) 
>>> np.concatenate((a, b), axis=0) 
array([[1, 2], 
     [3, 4], 
     [5, 6]]) 
+0

是的,我檢查了它,我不想在最終的3D陣列中的括號。而且我也遇到了問題,我的c是一個字符串。我相信它也表示 - 只有一個數組可以被轉換爲python標量 - 不知道這意味着什麼 –

+0

括號僅用於打印目的;它是一個3x2矩陣,不是嗎? –

+0

它不應該看起來像這樣嗎? [1,2; 3,4; 5,6]。用兩列表示兩行之間的差異。我相信如果我有方括號,那個特定的行將有它自己的特徵 - 可能是我錯了 - 但那就是我的理解是 –

0

您的a,b,c是列表;您必須使用np.array([1,2,3])才能獲得數組,並且它將顯示爲[1 2 3](不含逗號)。

只需在創建從這些名單的新列表生成列表

In [565]: d=[a,b,c] 
In [566]: d 
Out[566]: 
[[1, 2, 3, 4, 5], 
[3, 2, 2, 2, 8], 
['test1', 'test2', 'test3', 'test4', 'test5']] 

,並簡單地串接列表的列表產生一個較長的

In [567]: a+b+c 
Out[567]: [1, 2, 3, 4, 5, 3, 2, 2, 2, 8, 'test1', 'test2', 'test3', 'test4', 'test5'] 

numpy陣列具有同時包含數字和字符串的問題。你必須創建一個「結構化數組」。

到這些組合成一個陣列的最簡單的方法是用一個fromarrays效用函數:

In [561]: x=np.rec.fromarrays(([1,2,3],[3,2,2],['test1','test2','test3'])) 
In [562]: x['f0'] 
Out[562]: array([1, 2, 3]) 
In [563]: x['f2'] 
Out[563]: 
array(['test1', 'test2', 'test3'], 
     dtype='<U5') 

In [568]: x 
Out[568]: 
rec.array([(1, 3, 'test1'), (2, 2, 'test2'), (3, 2, 'test3')], 
      dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<U5')]) 

或與顯示器的一個小的編輯:

In [569]: print(x) 
[(1, 3, 'test1') 
(2, 2, 'test2') 
(3, 2, 'test3')] 

這不是一個二維陣列;它是1d(這裏是3個元素),有3個字段。

也許格式化這個數組中,看起來像你的天賦是有csv作家的方式最簡單的方法:

In [570]: np.savetxt('x.txt',x,fmt='%d %d %s;') 
In [571]: cat x.txt  # shell command to display the file 
1 3 test1; 
2 2 test2; 
3 2 test3; 
+0

謝謝。好答案。 –