如何将numpy.recarray转换为numpy.array?

如何将numpy.recarray转换为numpy.array?,第1张

如何将numpy.recarray转换为numpy.array?

“正常数组”是指同构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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5462362.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存