簡體   English   中英

將一維numpy數組轉換為列表列表

[英]Converting a 1D numpy array to a list of lists

我想將一維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"]...]

我怎樣才能做到這一點? 而且,如果你們知道實現我想要的更好的方法(即一種數據結構,可以在其中訪問每個標記作為指定行的元素),那么我將很高興聽到它。

提前致謝。

使用列表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']]

具有dtype=object的數組與falsetru答案中的版本具有falsetru 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

這是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']]

(請注意,如果您的dtype是object ,請首先使用A = A.astype('S')使其成為字符串數組。)

老實說,在長度為5000的數組中,這似乎與循環理解的速度大致相同。 np.char可能在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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM