【发布时间】:2022-01-14 10:45:57
【问题描述】:
我获得了视频中每一帧的面部特征。有477的地标,每一个都是一个(3,)向量。
我有一个 30 fps 的 10 分钟视频。这意味着我有18000 形状为(477,3) 的数组。我想将所有这些信息存储在一个熊猫数据框中,其中每一行都是一个框架,有 477 列,每个 (3,) 数组一个。
目前,我正在这样做:
frame_lms = []
for frame in video:
landmark_dict = {}
lm_count = 0
for landmark in frame:
x = landmark.x
y = landmark.y
xy = np.array([x,y])
landmark_dict[f"lm_{count}"] = xy
lm_count+=1
frame_lms.append(landmark_dict)
df = pd.DataFrame.from_dict(frame_lms)
df.to_csv('save.csv')
我的想法是将所有内容存储在 dicts 列表中,附加到列表中,然后保存研究表明 from_dict 是创建 pandas df 的最快方法。但是,这个过程仍然很慢,因为我必须将frame_lms 保持在状态,当我将(477,3) 数组添加到其中时,它会变得很大。
解决此类问题的计算效率最高的方法是什么?
【问题讨论】:
-
这里有一个错字:
landmark_dict[f"lm_{count}"] = xy应该是lm_count在大括号中 -
您是否尝试过提前在或 pandas 数据帧中创建一个 numpy 数组,然后存储这些值?
-
@azelcer 追加到 numpy 数组比追加到列表更快?
-
我建议不要追加,而是提前创建数组:
rv = np.empty((len(video, 477, 3)),然后使用索引设置值。我认为您可能在创建对象上花费了太多时间。 -
不要使用熊猫。使用 numpy,存储二进制数据。您的数据是一个大矩阵。使用 dicts 或任何复杂的东西的理由为零。
标签: python arrays pandas opencv mediapipe