有没有一种更快的方法让bin文件变成numpy数组?

2024-06-25 23:22:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用以下代码将数据从.bin文件导入numpy数组:

dt = np.dtype([('ShotNum', np.uint32), ('X', np.float32), ('Y', np.float32),\
        ('Z', np.float32),('inten', np.float32), ('refl', np.float32),\
        ('dopp', np.float32),('range', np.float32),('theta', np.float32),\
        ('phi', np.float32)])
data=np.fromfile('Data.bin',dtype=dt)
#Flatten Array and then recreate into array of desired dimension
flatdata=list(itertools.chain.from_iterable(data))
flatdata1=np.asarray(flatdata,dtype=float)
workdata=flatdata1.reshape(flatdata1.size//10,10)

它起作用了,但很慢。特别是在行中的数据结构中解包元组

flatdata=list(itertools.chain.from_iterable(data))

非常慢。在导入数据时,有没有一种方法可以避免在第一时间创建这种嵌套结构?如果没有,有没有更快的方法来压平?你知道吗


Tags: 数据方法fromchaindatabinnpdt
1条回答
网友
1楼 · 发布于 2024-06-25 23:22:14

演示chain在展平结构化数组中的用法:

In [107]: data
Out[107]: 
array([( 1.,  2.,  3., 1), ( 1.,  2.,  3., 1), ( 1.,  2.,  3., 1)],
      dtype=[('a', '<f4'), ('b', '<f4'), ('c', '<f4'), ('d', '<i4')])
In [108]: import itertools
In [109]: list(itertools.chain.from_iterable(data))
Out[109]: [1.0, 2.0, 3.0, 1, 1.0, 2.0, 3.0, 1, 1.0, 2.0, 3.0, 1]

chain是一种成熟的压平嵌套列表的方法。你知道吗

将结构化数组转换为二维数组有点棘手。viewastype有时有效,但最可靠的是另一种列表方法:

In [110]: data.tolist()
Out[110]: [(1.0, 2.0, 3.0, 1), (1.0, 2.0, 3.0, 1), (1.0, 2.0, 3.0, 1)]
In [111]: np.array(data.tolist())
Out[111]: 
array([[ 1.,  2.,  3.,  1.],
       [ 1.,  2.,  3.,  1.],
       [ 1.,  2.,  3.,  1.]])

制作等效阵列:

In [115]: np.fromiter(itertools.chain.from_iterable(data),float).reshape(3,-1)
Out[115]: 
array([[ 1.,  2.,  3.,  1.],
       [ 1.,  2.,  3.,  1.],
       [ 1.,  2.,  3.,  1.]])

tolist更快:

In [116]: timeit np.fromiter(itertools.chain.from_iterable(data),float).reshape
     ...: (3,-1)
22 µs ± 329 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [117]: timeit np.array(data.tolist())
5.8 µs ± 13.3 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

正如注释中所建议的,我们可以枚举字段,并从中生成一个数组:

In [120]: [data[name] for name in data.dtype.names]
Out[120]: 
[array([ 1.,  1.,  1.], dtype=float32),
 array([ 2.,  2.,  2.], dtype=float32),
 array([ 3.,  3.,  3.], dtype=float32),
 array([1, 1, 1])]

In [124]: np.array([data[name] for name in data.dtype.names]).T
Out[124]: 
array([[ 1.,  2.,  3.,  1.],
       [ 1.,  2.,  3.,  1.],
       [ 1.,  2.,  3.,  1.]])

tolist方法相似的时间:

In [125]: timeit np.array([data[name] for name in data.dtype.names]).T
6.94 µs ± 14.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

相关问题 更多 >