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

Jir*_*Jir 7 python string numpy list

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',
...
Run Code Online (Sandbox Code Playgroud)

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

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

这导致具有2-D阵列:

array([[  0.,   0.],
       [ 14.,   0.],
       [ 19.,   0.],
       [ 22.,   0.],
...
Run Code Online (Sandbox Code Playgroud)

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

sun*_*tos 4

这对我来说要快得多:

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])
Run Code Online (Sandbox Code Playgroud)

变化:

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

  • aa = numpy.array([x.split(' ',2)[0:2] for x in br], dtype='float') (4认同)