我有一个字符串如下:
1|234|4456|789
我必须把它转换成numpy数组。我想知道最有效的方法。因为我将调用这个函数超过5000万次!
答案 0 :(得分:15)
最快的方法是使用numpy.fromstring方法:
>>> import numpy
>>> data = "1|234|4456|789"
>>> numpy.fromstring(data, dtype=int, sep="|")
array([ 1, 234, 4456, 789])
答案 1 :(得分:7)
@jterrace赢得一(1)个互联网。
在下面的测量中,示例代码已经缩短,以允许测试适合一行,而不会在可能的情况下滚动。
对于那些不熟悉timeit
the -s
flag allows you to specify a bit of code which will only be executed once的人。
最快且最不杂乱的方式是使用numpy.fromstring
作为jterrace建议:
python -mtimeit -s"import numpy;s='1|2'" "numpy.fromstring(s,dtype=int,sep='|')"
100000 loops, best of 3: 1.85 usec per loop
以下三个示例将string.split
与其他工具结合使用。
string.split
的 numpy.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
{p> string.split
通过generator-expression 投射int()
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
带有类型为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
答案 2 :(得分:5)
试试这个:
import numpy as np
s = '1|234|4456|789'
array = np.array([int(x) for x in s.split('|')])
......假设这些数字都是整数。如果没有,请在上面的代码段中将int
替换为float
。
编辑1:
或者,您可以执行此操作,它只会创建一个中间列表(由split()
生成的列表):
array = np.array(s.split('|'), dtype=int)
编辑2:
另一种方式,可能更快(感谢所有评论,伙计们!):
array = np.fromiter(s.split("|"), dtype=int)