如何从多个简单数组创建结构化数组
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 个回答
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
稍微快一点。
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