簡體   English   中英

我可以根據半結構化二進制數據有效地創建熊貓數據框嗎?

[英]Can I efficiently create a pandas data frame from semi-structured binary data?

我需要將大型二進制文件轉換為nx 3數組。 數據是由(x,y,time)坐標定義的一系列圖像幀。 每個幀使用兩個32位整數來定義nx 3個維度,並使用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)

上面的方法可以工作,但是while循環非常慢,特別是與以下結構化方法相比時,如果int32值不妨礙,它將很好地工作(並且快幾個數量級):

dt = np.dtype([('x', '<u2'), ('y', '<u2'), ('time', '<u2')])
data = np.fromfile("file.bin", dtype=dt)
df = pd.DataFrame(data.tolist(), columns=data.dtype.names)

有沒有更有效的方法來解決這個問題? 如果是這樣,那么在解壓縮二進制數據時,或者在將其轉換為整數之后,這樣做會更容易嗎?

我目前正在考慮使用生成器將二進制文件作為一系列塊讀取(即,使用兩個32位整數來確定我需要的16位整數塊有多大),但是我還不熟悉這些知識足以說明這是否是正確的方法。

每次追加到數據框時,您都將整個內容復制到內存中的新位置。 您將要使用最終大小完整的numpy數組初始化數據幀,然后在用成像數據填充數據時使用iloc()等索引到該幀。

另外,您是否有使用熊貓數據框存儲成像數據的特定原因? 他們並不是真的要這么做...

count參數通過允許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')
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'])

結果比原始問題中描述的版本快三個數量級。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM