将分隔符分隔的字符串转换为numpy数组的有效方法

Sre*_*ndh 12 python numpy

我有一个字符串如下:

1|234|4456|789
Run Code Online (Sandbox Code Playgroud)

我必须把它转换成numpy数组.我想知道最有效的方法.因为我将调用这个函数超过5000万次!

jte*_*ace 19

最快的方法是使用numpy.fromstring方法:

>>> import numpy
>>> data = "1|234|4456|789"
>>> numpy.fromstring(data, dtype=int, sep="|")
array([   1,  234, 4456,  789])
Run Code Online (Sandbox Code Playgroud)


ber*_*nie 8

@jterrace赢得一(1)个互联网.

在下面的测量中,示例代码已经缩短,以允许测试适合在一条线上,而不会在可能的情况下滚动.

对于那些不熟悉timeit -s标志允许你指定位的代码将只执行一次.


最快和最杂乱的方式是使用numpy.fromstringjterrace建议:

python -mtimeit -s"import numpy;s='1|2'" "numpy.fromstring(s,dtype=int,sep='|')"
100000 loops, best of 3: 1.85 usec per loop
Run Code Online (Sandbox Code Playgroud)

以下三个示例string.split与另一个工具结合使用.

string.splitnumpy.fromiter

python -mtimeit -s"import numpy;s='1|2'" "numpy.fromiter(s.split('|'),dtype=int)"
100000 loops, best of 3: 2.24 usec per loop
Run Code Online (Sandbox Code Playgroud)

string.splitint()通过发电机表达铸

python -mtimeit -s"import numpy;s='1|2'" "numpy.array(int(x) for x in s.split('|'))"
100000 loops, best of 3: 3.12 usec per loop
Run Code Online (Sandbox Code Playgroud)

string.split 使用NumPy类型的数组 int

python -mtimeit -s"import numpy;s='1|2'" "numpy.array(s.split('|'),dtype=int)"
100000 loops, best of 3: 9.22 usec per loop
Run Code Online (Sandbox Code Playgroud)


Ósc*_*pez 5

试试这个:

import numpy as np
s = '1|234|4456|789'
array = np.array([int(x) for x in s.split('|')])
Run Code Online (Sandbox Code Playgroud)

...假设这些数字都是整数.如果不是,则更换intfloat在上面的代码段中.

编辑1:

或者,您可以这样做,它只会创建一个中间列表(生成者split()):

array = np.array(s.split('|'), dtype=int)
Run Code Online (Sandbox Code Playgroud)

编辑2:

而另一种方式,可能更快(感谢所有评论,伙计们!):

array = np.fromiter(s.split("|"), dtype=int)
Run Code Online (Sandbox Code Playgroud)