我想将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 :(得分: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')
答案 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)