2015-08-22 411 views
4

我有一個由0和1組成的字符串,如'00101'。我想將它轉換爲numpy數組numpy.array([0,0,1,0,1]如何快速將字符串'001100'轉換爲numpy.array([0,0,1,1,0,0])?

我使用for循環,如:

import numpy as np 
X = np.zeros((1,5),int) 
S = '00101' 
for i in xrange(5): 
    X[0][i] = int(S[i]) 

但因爲我有很多的字符串,並且每個字符串的長度爲1024,這樣是很慢的。有沒有更好的方法來做到這一點?

回答

2

我覺得列表理解會比你的正常速度更快的循環方法 -

import numpy as np 

s = '00101' 

np.array([int(c) for c in s]) 
array([0, 0, 1, 0, 1]) 

Timeit比較方法(見1024長度的字符串) -

In [41]: S = '0' * 512 + '1' * 512 

In [43]: %%timeit 
    ....: X = np.zeros((1,len(S)),int) 
    ....: for i in range(len(S)): 
    ....:  X[0][i] = int(S[i]) 
    ....: 
1000 loops, best of 3: 854 µs per loop 

In [45]: %%timeit 
    ....: Y = np.array([int(c) for c in S]).reshape((1,len(S))) 
    ....: 
1000 loops, best of 3: 339 µs per loop 

我做的重塑,這樣兩個陣列的形狀都是一樣的,但我不認爲你真的需要重塑,因爲列表理解你得到的數組的形狀是(<length of string> ,)

0

np.array(map(lambda x: int(x), s))

+2

什麼是'lambda'呢?只需使用'int' –

1

如何使用fromstring方法?

np.fromstring('1, 2', dtype=int, sep=',') 

更多細節here

7

地圖應該比列表比較快一點:

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 

使用fromiter又一次更快的傳遞dtype=int是:

In [21]: timeit np.fromiter(s,dtype=int) 
1000 loops, best of 3: 289 µs per loop 

借用這個answer,使用fromstring和UINT8爲D型是最快的:

In [54]: timeit np.fromstring(s, 'int8') - 48 
100000 loops, best of 3: 4.54 µs per loop 

即使重新綁定的名稱和改變dtype仍然是最快的:

In [71]: %%timeit 
    ....: arr = np.fromstring(s, 'int8') - 48 
    ....: arr = arr.astype(int) 
    ....: 
100000 loops, best of 3: 6.23 µs per loop 

甚至比快得多阿什維尼的加入:

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不限於一和零,但將所有的ASCII數字組成的字符串工作。

2

使用numpy.fromstring

>>> s = '00101' 
>>> np.fromstring(' '.join(s), sep=' ', dtype=int) 
array([0, 0, 1, 0, 1]) 

>>> s = '00101' * 1000 
>>> %timeit np.fromiter(s, dtype=int) 
100 loops, best of 3: 2.33 ms per loop 
>>> %timeit np.fromstring(' '.join(s), sep=' ', dtype=int) 
1000 loops, best of 3: 499 µs per loop