2013-12-03 122 views
1

我想將一維numpy數組拆分爲列表列表,但我不知道該怎麼做。將1D numpy數組轉換爲列表列表

基本上我處理的是充滿變量數組:

array(['java database servlets derby', 'java graphics groovy awt basic', 
     'java lucene', ..., 'javascript android', 
     'iphone ios ipad file uiimage', 
     'javascript jquery transition effect'], dtype=object) 

與形狀:

(5000L,) 

正如你所看到的每一行包含的空格分隔標籤。我想將每一行存儲爲一個列表,並將所有標記作爲單獨的元素並將這些列表組合到一個列表列表中。 結果應該是這樣的,那麼:

list_of_lists = [["tag","tag","tag"],["tag","tag","tag"]...] 

我怎麼能做到這一點?如果你們知道一個更好的方法來實現我想要的(即我可以訪問每個標記作爲指定行的一個元素的數據結構),我會很高興聽到它。

在此先感謝。

+0

你爲什麼使之成爲一個'np.array',而不是留下一個Python列表? – hpaulj

+0

我使用的文件閱讀器(pandas.to_csv)返回一個np.array對象。 – Learner

回答

4

使用列表理解,str.split

>>> from numpy import array 
>>> a = array(['java database servlets derby', 'java graphics groovy awt basic', 
...   'java lucene', 'javascript android', 
...   'iphone ios ipad file uiimage', 
...   'javascript jquery transition effect']) 
>>> list_of_lists = [x.split() for x in a] 
>>> list_of_lists 
[['java', 'database', 'servlets', 'derby'], 
['java', 'graphics', 'groovy', 'awt', 'basic'], 
['java', 'lucene'], 
['javascript', 'android'], 
['iphone', 'ios', 'ipad', 'file', 'uiimage'], 
['javascript', 'jquery', 'transition', 'effect']] 
+0

非常感謝! – Learner

3

沒有與dtype=objectfalsetru答案,其中有dtype='|S35'版本陣列之間字幕差值。第一個是指向字符串的指針數組,另一個是長度爲35的6個字符串,總共210個字節。 [x.split() for x in a]對於兩者都是相同的。但object陣列允許:

for i in range(6): a[i]=a[i].split() 

生產

array([['java', 'database', 'servlets', 'derby'], 
     ['java', 'graphics', 'groovy', 'awt', 'basic'], ['java', 'lucene'], 
     ['javascript', 'android'], 
     ['iphone', 'ios', 'ipad', 'file', 'uiimage'], 
     ['javascript', 'jquery', 'transition', 'effect']], dtype=object) 

如果這些子表都具有相同的長度,或填充到相同的長度,可以把它們放在一個結構數組。例如

array([('java', 'database', 'servlets', 'derby', ''), 
     ('java', 'graphics', 'groovy', 'awt', 'basic'), 
     ('java', 'lucene', '', '', ''), 
     ('javascript', 'android', '', '', ''), 
     ('iphone', 'ios', 'ipad', 'file', 'uiimage'), 
     ('javascript', 'jquery', 'transition', 'effect', '')], 
     dtype=[('f0', 'S10'), ('f1', 'S10'), ('f2', 'S10'), ('f3', 'S10'), ('f4', 'S10')]) 

,那麼你可以訪問特定的領域,在所有 '行',由名

a2['f0'] 
# array(['java', 'java', 'java', 'javascript', 'iphone', 'javascript'],dtype='|S10') 

http://docs.scipy.org/doc/numpy/user/basics.rec.html

2

這是numpy的,請不要使用循環:P您可以使用np.char.split僅將split同時應用於陣列的所有元件:

A = np.char.split(A) 

你並不需要使它的列表,如果你真的只是想

的數據結構,我可以訪問每一個標籤作爲指定行

只是數組的元素工作正常即:

>>> A = np.char.split(A) 
>>> A[0] 
['java', 'database', 'servlets', 'derby'] 
>>> A 
array([['java', 'database', 'servlets', 'derby'], 
     ['java', 'graphics', 'groovy', 'awt', 'basic'], ['java', 'lucene'], 
     ['javascript', 'android'], 
     ['iphone', 'ios', 'ipad', 'file', 'uiimage'], 
     ['javascript', 'jquery', 'transition', 'effect']], dtype=object) 

但是你可以轉換到一個列表有:

>>> A.tolist() 
[['java', 'database', 'servlets', 'derby'], 
['java', 'graphics', 'groovy', 'awt', 'basic'], 
['java', 'lucene'], 
['javascript', 'android'], 
['iphone', 'ios', 'ipad', 'file', 'uiimage'], 
['javascript', 'jquery', 'transition', 'effect']] 

(請注意,如果你的D型爲object,使用A = A.astype('S')首先要使它成爲一個字符串數組。)

說實話,在長度5000陣列,看來這是大致相同的速度循環理解,雖然。 np.char可能在引擎蓋下並沒有太大的區別。

順便說一句,如果你不使用熊貓做任何事情,你可以用numpy自己閱讀文本。如果你的文件看起來像:

java database servlets derby 
java graphics groovy awt basic 
java lucene 
javascript android 
iphone ios ipad file uiimage 
javascript jquery transition effect 

然後:

A = np.genfromtxt('tags.txt', dtype='S', delimiter='\n') 
A = np.char.split(A) 
+1

我使用'[x.split()for a.tolist()]'獲得了最佳時間,'char.split'的一半時間。這是一個小例子。 'char.split'文件說:'調用'str.rsplit'element-wise.'字符串和對象數組還沒有針對數值數組的速度進行優化。 – hpaulj

+0

是的,@hpaulj,對於我來說,長列表的所有時間都在彼此的5%以內。即使其他所有條件都是平等的,我個人也會嘗試使用矢量化解決方案,但這更像是一種風格偏好,而不是任何真正的偏好。我發現沒有多少人知道'np.char',所以我想指出,因爲在很多情況下,替代列表理解解決方案是一個真正的痛苦,特別是對於2d或更大的陣列。 – askewchan

+1

'np.char._vec_string(a,object _,'split')'稍微快一點,因爲它可以在沒有參數的情況下調用split。 '_vec_string'是'C'代碼,但是由於它必須調用像'split'這樣的Py方法,所以它不會獲得速度。 numpy/core/src/multiarray/multiarraymodule.c – hpaulj