如何将Pandas DataFrame的object类型图像数据列转为Numpy数组?
解决Pandas DataFrame图像列转Numpy数组形状异常的问题
这问题我之前也碰到过!核心问题出在你用np.append()处理多维图像数据的方式上——它会自动把多维数组扁平化,导致最终的图像数组变成了一维的像素堆,而不是保留每个图像的三维结构。而且循环调用np.append()的效率极低,每次都会重新分配内存,数据量大的时候会特别慢。
下面给你两种高效的解决方案:
方法一:直接用Pandas+Numpy的内置方法(推荐)
不需要写循环,直接提取列并转换,这是最简洁高效的方式:
# 处理图像数据:先转成列表再转numpy数组,自动保留多维结构 train_img_array = np.array(img_train['data'].tolist()) # ID和类别可以直接用to_numpy()转换 train_id_array = img_train['ID'].to_numpy() train_lab_array = img_train['class'].to_numpy()
这样转换后,train_img_array的形状会是(样本数, 图像高度, 图像宽度, 通道数)(比如你的58个样本如果是256x256x4的图像,形状就是(58,256,256,4)),完全符合你的需求。
方法二:用列表收集再转数组(如果一定要用循环场景)
如果因为某些原因必须用循环处理每行数据,不要直接用np.append(),而是先把每个图像数组存入列表,最后一次性转成numpy数组:
# 初始化空列表 train_img_list = [] train_id_list = [] train_lab_list = [] # 循环收集数据 for index, row in img_train.iterrows(): train_img_list.append(row['data']) train_lab_list.append(row['class']) train_id_list.append(row['ID']) # 最后统一转成numpy数组 train_img_array = np.array(train_img_list) train_id_array = np.array(train_id_list) train_lab_array = np.array(train_lab_list)
列表的append()操作是 amortized O(1) 的,比numpy的append()高效太多,而且能完整保留每个图像的多维结构,最终转成的数组形状也会是正确的。
额外注意事项
如果转换后train_img_array的类型是object,说明你的DataFrame里存在不同形状的图像,这时候需要先统一所有图像的尺寸(比如用PIL或OpenCV的resize方法),再进行转换,否则numpy无法将它们堆叠成规整的多维数组。
内容的提问来源于stack exchange,提问作者redwolf_cr7
相关产品推荐
相关产品推荐

