将1D numpy数组转换为列表列表

时间:2013-12-03 18:44:52

标签: python arrays list 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"]...]

我怎么能实现这个目标?如果你们知道一个更好的方法来实现我想要的东西(即我可以将每个标签作为指定行的元素访问的数据结构),我很高兴听到它。

提前致谢。

3 个答案:

答案 0 :(得分: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']]

答案 1 :(得分:3)

dtype=object数组与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)

如果所有这些子列表具有相同的长度,或填充到相同的长度,则可以将它们放入结构化阵列中。 e.g。

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 :(得分: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']]

(请注意,如果您的dtype为object,请先使用A = A.astype('S')将其设为字符串数组。)

老实说,在长度为5000的数组中,似乎这与循环理解的速度大致相同。 np.char可能在引擎盖下没有太大的不同。

顺便说一句,如果您没有将pandas用于其他任何事情,您可以使用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)