Python 如何转换字符串形式的';001100';要快速创建numpy.array([0,0,1,1,0,0])?
我有一个由0和1组成的字符串,比如Python 如何转换字符串形式的';001100';要快速创建numpy.array([0,0,1,1,0,0])?,python,numpy,types,format,type-conversion,Python,Numpy,Types,Format,Type Conversion,我有一个由0和1组成的字符串,比如'00101'。我想把它转换成numpy数组numpy.array([0,0,1,0,1]) 我正在使用进行类似以下循环的操作: import numpy as np X = np.zeros((1,5),int) S = '00101' for i in xrange(5): X[0][i] = int(S[i]) 但是因为我有很多字符串,每个字符串的长度是1024,所以这种方法非常慢。有没有更好的方法来实现这一点呢?我认为列表理解会比普通的for循
'00101'
。我想把它转换成numpy数组numpy.array([0,0,1,0,1]
)
我正在使用进行类似以下循环的操作:
import numpy as np
X = np.zeros((1,5),int)
S = '00101'
for i in xrange(5):
X[0][i] = int(S[i])
但是因为我有很多字符串,每个字符串的长度是1024,所以这种方法非常慢。有没有更好的方法来实现这一点呢?我认为列表理解会比普通的for循环方法更快-
import numpy as np
s = '00101'
np.array([int(c) for c in s])
array([0, 0, 1, 0, 1])
Timeit与方法的比较(字符串长度为1024)-
我做了重塑,只是为了使两个数组都是相同的形状,但我不认为你真的需要重塑,根据列表理解,你得到的数组的形状是(,)
np.array(map(lambda x:int(x),s))
使用fromstring方法怎么样
np.fromstring('1, 2', dtype=int, sep=',')
更多详细信息地图应该比列表快一点:
import numpy as np
arr = np.array(map(int,'00101'))
一些计时显示它位于1024个字符的字符串上:
In [12]: timeit np.array([int(c) for c in s])
1000 loops, best of 3: 422 µs per loop
In [13]: timeit np.array(map(int,s))
1000 loops, best of 3: 389 µs per loop
只需在s中调用列表并使用dtype=int更快:
In [20]: timeit np.array(list(s), dtype=int)
1000 loops, best of 3: 329 µs per loop
再次使用和传递dtype=int
更快:
In [21]: timeit np.fromiter(s,dtype=int)
1000 loops, best of 3: 289 µs per loop
借用这一点,使用fromstring和uint8作为数据类型是最快的:
In [54]: timeit np.fromstring(s, 'int8') - 48
100000 loops, best of 3: 4.54 µs per loop
In [71]: %%timeit
....: arr = np.fromstring(s, 'int8') - 48
....: arr = arr.astype(int)
....:
100000 loops, best of 3: 6.23 µs per loop
即使重新绑定名称和更改数据类型也是目前最快的:
In [54]: timeit np.fromstring(s, 'int8') - 48
100000 loops, best of 3: 4.54 µs per loop
In [71]: %%timeit
....: arr = np.fromstring(s, 'int8') - 48
....: arr = arr.astype(int)
....:
100000 loops, best of 3: 6.23 µs per loop
比Ashwini的加入速度还要快:
In [76]: timeit np.fromstring(' '.join(s), sep=' ', dtype=int)
10000 loops, best of 3: 62.6 µs per loop
正如@Unutbu所指出的,np.fromstring(s,'int8')-48
不限于1和0,但适用于所有由ASCII数字组成的字符串。使用:
lambda的作用是什么?只需使用int