繁体   English   中英

以更快的方式转换numpy数组中的字符串列表

[英]Converting a list of strings in a numpy array in a faster way

br是字符串列表的名称,如下所示:

['14 0.000000 -- (long term 0.000000)\n',
 '19 0.000000 -- (long term 0.000000)\n',
 '22 0.000000 -- (long term 0.000000)\n',
...

我对前两列感兴趣,我想将其转换为numpy数组。 到目前为止,我已经提出了以下解决方案:

x = N.array ([0., 0.])
for i in br:
    x = N.vstack ( (x, N.array (map (float, i.split ()[:2]))) )

这导致具有2-D阵列:

array([[  0.,   0.],
       [ 14.,   0.],
       [ 19.,   0.],
       [ 22.,   0.],
...

但是,由于br相当大(约10 ^ 5个条目),这个过程需要一些时间。 我想知道,有没有办法实现相同的结果,但在更短的时间内?

这对我来说要快得多:

import numpy as N

br = ['14 0.000000 -- (long term 0.000000)\n']*50000
aa = N.zeros((len(br), 2))

for i,line in enumerate(br):
    al, strs = aa[i], line.split(None, 2)[:2]
    al[0], al[1] = float(strs[0]), float(strs[1])

变化:

  • 预分配numpy数组(这很大)。 您已经知道需要具有特定尺寸的二维数组。
  • 前两列只有split(),因为你不需要其余的。
  • 不要使用map():它比列表推导慢。 我甚至没有使用列表推导,因为你知道你只有2列。
  • 直接分配到预分配的数组,而不是在迭代时生成新的临时数组。

如果字符串列表来自文件,您可以尝试预处理(使用awk for exemple)字符串,并使用numpy.fromtxt。 如果你对这个列表的方式无能为力,你有几种可能:

  • 放弃。 您将每天运行一次此功能。 你不关心速度,你的实际解决方案已经足够好了
  • 用cython写一个IO插件。 你有很大的潜在收益,因为你将能够在c中完成所有循环,并直接影响大(10 ^ 5,2)numpy ndarray中的值
  • 尝试其他语言来解决您的问题。 如果使用c或haskell等语言,可以使用ctypes从python中调用dll中编译的函数

编辑

也许这种方法稍快一点:

def conv(mysrt):
    return map(float, mystr.split()[:2])

br_float = map(conv, br)
x = N.array(br_float)

更改

map (float, i.split()[:2])

map (float, i.split(' ',2)[:2])

可能会导致轻微的加速。 由于您只关心每行中前两个以空格分隔的项目,因此无需拆分整条线。 i.split(' ',2)2 i.split(' ',2)告诉split最多只能进行2次拆分。 例如,

In [11]: x='14 0.000000 -- (long term 0.000000)\n' 

In [12]: x.split()
Out[12]: ['14', '0.000000', '--', '(long', 'term', '0.000000)']

In [13]: x.split(' ',2)
Out[13]: ['14', '0.000000', '-- (long term 0.000000)\n']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM