我有一个字符串,如下所示:以分隔符分隔字符串转换有效的方式来numpy的阵列
1|234|4456|789
我必须把它转换成numpy的array.I想知道最有效的way.Since我会调用这个函数超过5000万次!
我有一个字符串,如下所示:以分隔符分隔字符串转换有效的方式来numpy的阵列
1|234|4456|789
我必须把它转换成numpy的array.I想知道最有效的way.Since我会调用这个函数超过5000万次!
的最快方式是使用numpy.fromstring方法:
>>> import numpy
>>> data = "1|234|4456|789"
>>> numpy.fromstring(data, dtype=int, sep="|")
array([ 1, 234, 4456, 789])
试试这个:
import numpy as np
s = '1|234|4456|789'
array = np.array([int(x) for x in s.split('|')])
...假设数字都是整数。如果不是,则在上面的代码片段中将int
替换为float
。
EDIT 1:
另外,也可以做到这一点,这只会造成一个中间列表(一个由split()
生成):
array = np.array(s.split('|'), dtype=int)
编辑2:
另一种方式,可能更快(感谢所有的评论,家伙!):
array = np.fromiter(s.split("|"), dtype=int)
与此我的问题的NumPy的阵列它会生成一个字符串中所有部分的内存列表。如果真的有五千万个零件,那么对于一个临时列表来说,这是很多额外的内存。 – 2012-03-22 03:15:35
@AdamMihalcin确实取决于正在使用的Python版本。在Python 3中,该列表将被懒惰地评估,并且不会创建中间列表。另外,OP表示该功能将被称为5000万次,而不是列表中有5000万个元素。 – 2012-03-22 03:19:54
@AdamMihalcin即使你使用'imap'或者一个生成器表达式?奥斯卡 - 在Python 3上,列表理解仍然会创建一个中间列表。 – agf 2012-03-22 03:20:01
@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
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
+1我喜欢赢得互联网:) – jterrace 2012-03-22 04:21:25
速度差异更好的解释! – 2013-02-07 16:52:11
+1:绝对是最快的呢。 – DSM 2012-03-22 03:46:24
为什么我没有想到..:P – wim 2012-03-22 04:06:28
非常感谢。..从@bernie时间计算非常高效.. :) – 2012-03-22 14:45:04