Python 如何转换字符串形式的';001100';要快速创建numpy.array([0,0,1,1,0,0])?

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循

我有一个由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循环方法更快-

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