Python 我能从半结构化二进制数据高效地创建熊猫数据帧吗?

Python 我能从半结构化二进制数据高效地创建熊猫数据帧吗?,python,pandas,numpy,binary,Python,Pandas,Numpy,Binary,我需要将大型二进制文件转换为nx3数组。数据是由(x,y,time)坐标定义的一系列图像帧。每个帧使用两个32位整数定义nx3维,使用n个三元组的16位整数定义(x,y,time)值。结果是一个二元结构,如下所示: int32、int32、uint16、uint16、uint16、…、int32、int32、uint16、uint16、uint16,依此类推 我的第一次尝试涉及将二进制数据转换为一维数组,然后将我想要的部分添加到数据帧中。当前数据已经以这样的方式进行排序,即可以在不使用两个int

我需要将大型二进制文件转换为nx3数组。数据是由(x,y,time)坐标定义的一系列图像帧。每个帧使用两个32位整数定义nx3维,使用n个三元组的16位整数定义(x,y,time)值。结果是一个二元结构,如下所示:

int32、int32、uint16、uint16、uint16、…、int32、int32、uint16、uint16、uint16
,依此类推

我的第一次尝试涉及将二进制数据转换为一维数组,然后将我想要的部分添加到数据帧中。当前数据已经以这样的方式进行排序,即可以在不使用两个
int32
值的情况下重建帧分离,因此如果需要,可以删除它们。如果不是这样,那么在将每个帧添加到最终数据帧之前,可以通过对每个帧进行单独排序来实现相同的效果

import numpy as np
import pandas as pd

def frame_extract(index):
    n = data[index]
    subarray=data[index+4:index+(3*n+4)]
    subarray=np.reshape(subarray, (len(subarray)/3,3))
    frame = pd.DataFrame(data=subarray, columns=['x','y','t'])
    return frame

def indexer(index):
    n = data[index]
    new_index = index+(3*n+4)
    return new_index

data = np.fromfile('file.bin', dtype='<u2')
framedata = pd.DataFrame()

index = 0
while index <= len(data)-1:
    framedata = framedata.append(frame_extract(index), ignore_index=True)
    index = indexer(index)
print(framedata)
有没有更有效的方法来解决这个问题?如果是这样,那么在解包二进制数据时,还是在将二进制数据转换为整数后,操作会更容易些


我目前正在考虑使用生成器将二进制文件读取为一系列块(即,使用两个32位整数来决定我需要的16位整数块有多大),但我对这些还不够熟悉,不知道这是否是正确的方法

每次附加到数据帧时,都是将整个内容复制到内存中的新位置。您需要使用具有完整最终大小的numpy数组初始化数据帧,然后在使用成像数据填充数据帧时,使用iloc()等对其进行索引


另外,您使用熊猫数据帧存储成像数据是否有特定原因?它们并非真的用于此…

参数通过允许
np.fromfile
利用
int32
值定义的结构简化了这一点。以下
for
循环分别创建每个图像帧:

f = open('file.bin', 'rb')
for i in np.arange(1,15001,1): 
    m, n = np.fromfile(f, dtype='<i', count=2)
    frame = np.reshape(np.fromfile(f, dtype='<u2', count=m*n), (m, n))
f=open('file.bin','rb')
对于np.arange中的i(115001,1):

m、 n=np.fromfile(f,dtype=)谢谢,填充初始化的数据帧要快得多,并且提供了一个可行的解决方案。但是,迭代文件的效率更高,因此我编辑了原始帖子以反映这一点。我使用熊猫与我的团队使用的其他程序一致;没有特殊原因。
f = open('file.bin', 'rb')
for i in np.arange(1,15001,1): 
    m, n = np.fromfile(f, dtype='<i', count=2)
    frame = np.reshape(np.fromfile(f, dtype='<u2', count=m*n), (m, n))
f = open('file.bin', 'rb')
xyt_data = list()
for i in np.arange(1,15001,1):
    m, n = np.fromfile(f, dtype='<i', count=2)
    frame = np.reshape(np.fromfile(f, dtype='<u2', count=m*n), (m, n))
    xyt_data.append(frame)
df = pd.DataFrame(np.vstack(xyt_data), columns=['x','y','t'])