将numpy的recarray
转换为普通数组的最佳方法是什么?
我可以先做一个.tolist()
,然后再做一个array()
,但这似乎有点低效。。
示例:
import numpy as np
a = np.recarray((2,), dtype=[('x', int), ('y', float), ('z', int)])
>>> a
rec.array([(30408891, 9.2944097561804909e-296, 30261980),
(44512448, 4.5273310988985789e-300, 29979040)],
dtype=[('x', '<i4'), ('y', '<f8'), ('z', '<i4')])
>>> np.array(a.tolist())
array([[ 3.04088910e+007, 9.29440976e-296, 3.02619800e+007],
[ 4.45124480e+007, 4.52733110e-300, 2.99790400e+007]])
我认为“普通数组”是指一个同质数据类型的NumPy数组。重新排列,例如:
我们必须首先使每个列具有相同的数据类型。然后,我们可以通过按相同的数据类型查看数据,将其转换为“普通数组”:
astype返回一个新的numpy数组。因此,上述操作需要与
a
大小成比例的额外内存。每行a
需要4+8+4=16字节,而a.astype(...)
需要8*3=24字节。调用view不需要新的内存,因为view
只改变底层数据的解释方式。a.tolist()
返回一个新的Python列表。每个Python数都是一个比numpy数组中的等效表示形式需要更多字节的对象。所以a.tolist()
需要比a.astype(...)
更多的内存。调用
a.astype(...).view(...)
也比np.array(a.tolist())
快:相关问题 更多 >
编程相关推荐