2011-11-22 74 views
1
import numpy as np 

a=np.array([1,2,3,4,5,6,7,8,9]) 
b=np.array(["a","b","c","d","e","f","g","h","i"]) 
c=np.array([9,8,7,6,5,4,3,2,1]) 
datatype=np.dtype({ 
'names':['num','char','len'], 
'formats':['i','S32','i'] 
}) 

d=np.array(zip(a,b,c),dtype=datatype) 

上面的代码使用zip()首先创建列表,然后将其转换为结构化数组。效率低下,我想知道NumPy中是否有任何内置函数可以做到这一点。如何从多个简单的阵列构建结构化阵列

回答

2

你不妨试试numpy.rec.fromarrays

import numpy as np 

a=np.array([1,2,3,4,5,6,7,8,9]) 
b=np.array(["a","b","c","d","e","f","g","h","i"]) 
c=np.array([9,8,7,6,5,4,3,2,1]) 

d = np.rec.fromarrays([a,b,c], formats=['i','S32','i'], names=['num','char','len']) 

虽然时间不如使用itertools好。

In [2]: %timeit d = np.rec.fromarrays([a,b,c], formats=['i','S32','i'], names=['num','char','len']) 
10000 loops, best of 3: 86.5 us per loop 

In [6]: import itertools 

In [7]: %timeit np.fromiter(itertools.izip(a,b,c),dtype=datatype) 
100000 loops, best of 3: 11.5 us per loop 
+0

谢谢,fromarrays是我正在寻找。 – HYRY

2

zip确实创建了元组列表,如果数组很大,这可能会占用大量内存。可以使用itertools.izip更内存效率:

import itertools 
d=np.fromiter(itertools.izip(a,b,c),dtype=datatype) 

对于长度的小阵列〜10:

In [68]: %timeit np.fromiter(itertools.izip(a,b,c),dtype=datatype) 
100000 loops, best of 3: 15.8 us per loop 

In [69]: %timeit np.array(zip(a,b,c),dtype=datatype) 
10000 loops, best of 3: 20.8 us per loop 

对于长度的阵列〜10000:

In [72]: A=np.tile(a,1000) 
In [74]: B=np.tile(b,1000) 
In [75]: C=np.tile(c,1000) 

In [83]: %timeit np.fromiter(itertools.izip(A,B,C),dtype=datatype) 
100 loops, best of 3: 10.7 ms per loop 

In [84]: %timeit np.array(zip(A,B,C),dtype=datatype) 
100 loops, best of 3: 12.7 ms per loop 

所以np.fromiter看起来比np.array稍快。