“正常数组”是指同构dtype的NumPy数组。给定一个rearray,例如:
>>> a = np.array([(0, 1, 2), (3, 4, 5)],[('x', int), ('y', float), ('z', int)]).view(np.recarray)rec.array([(0, 1.0, 2), (3, 4.0, 5)], dtype=[('x', '<i4'), ('y', '<f8'), ('z', '<i4')])
我们必须首先使每个列具有相同的dtype。然后,可以通过使用相同的dtype查看数据,将其转换为“普通数组”:
>>> a.astype([('x', '<f8'), ('y', '<f8'), ('z', '<f8')]).view('<f8')array([ 0., 1., 2., 3., 4., 5.])
astype返回一个新的numpy数组。因此上述要求额外的存储空间与的大小成正比
a。每行
a需要4
+ 8 + 4 = 16字节,而
a.astype(...)需要8 * 3 =
24字节。调用视图不需要新的内存,因为
view仅更改了基础数据的解释方式。
a.tolist()返回一个新的Python列表。每个Python数字都是一个对象,比其在numpy数组中的等效表示形式需要更多的字节。因此
a.tolist()需要更多的内存
a.astype(...)。
通话
a.astype(...).view(...)也比
np.array(a.tolist()):
In [8]: a = np.array(zip(*[iter(xrange(300))]*3),[('x', int), ('y', float), ('z', int)]).view(np.recarray)In [9]: %timeit a.astype([('x', '<f8'), ('y', '<f8'), ('z', '<f8')]).view('<f8')10000 loops, best of 3: 165 us per loopIn [10]: %timeit np.array(a.tolist())1000 loops, best of 3: 683 us per loop
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)