2011-11-22 76 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稍快。