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

Python 将分隔符分隔的字符串转换为numpy数组的有效方法,python,numpy,Python,Numpy,我有一个字符串,如下所示: 1|234|4456|789 我必须把它转换成numpy数组。我想知道最有效的方法。因为我将调用这个函数超过5000万次 试试这个: import numpy as np s = '1|234|4456|789' array = np.array([int(x) for x in s.split('|')]) 。。。假设这些数字都是整数。如果没有,请将上述代码片段中的int替换为float 编辑1: 或者,您也可以这样做,它将只创建一个中间列表(由split()生

我有一个字符串,如下所示:

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

试试这个:

import numpy as np
s = '1|234|4456|789'
array = np.array([int(x) for x in s.split('|')])
。。。假设这些数字都是整数。如果没有,请将上述代码片段中的
int
替换为
float

编辑1:

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

编辑2:

还有另一种方式,可能更快(谢谢大家的评论!)


最快的方法是使用以下方法:

赢得一(1)个互联网

在下面的测量中,示例代码被缩短,以允许测试在一行上进行,而无需在可能的情况下滚动

对于那些不熟悉
timeit
的人


最快、最简单的方法是使用jterrace建议的
numpy.fromstring

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
string.split
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
与类型为
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

问题是它会生成一个包含字符串所有部分的内存列表。如果确实有5000万个部分,那么对于一个临时列表来说,这是一个很大的额外内存。@AdamMihalcin这实际上取决于使用的Python版本。在Python3中,列表是惰性计算的,不会创建中间列表。此外,OP说该函数将被调用5000万次,而不是说列表中有5000万个元素。@AdamMihalcin,即使您使用
imap
或生成器表达式?Oscar-在Python 3上,列表理解仍然会创建一个中间列表。您可以将其简化为
array=np.array(s.split('|'),dtype=int)
。但这仍然给您留下了一个很大的内存列表。FWIW我发现np.fromiter(s.split(“|”)的速度快了好几倍。为什么我没有想到非常感谢你。。根据@bernie时间计算,效率相当高:)更好的解释速度差!
python -mtimeit -s"import numpy;s='1|2'" "numpy.fromiter(s.split('|'),dtype=int)"
100000 loops, best of 3: 2.24 usec per loop
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
python -mtimeit -s"import numpy;s='1|2'" "numpy.array(s.split('|'),dtype=int)"
100000 loops, best of 3: 9.22 usec per loop