将DataFrame中字符串格式数组转换为NumPy ndarray的方法
解决方案
方法1:字符串转数组(针对已存储的字符串格式数据)
如果你的DataFrame列中已经是带空格分隔、可能包含...的字符串格式像素数组,可以用以下安全的转换方法:
首先导入依赖库:
import ast import numpy as np import pandas as pd
编写转换函数:
def str_to_pixel_array(img_str): # 移除字符串中的省略号(如果是显示占位符) cleaned_str = img_str.replace('...', '') # 将空格替换为逗号,使字符串符合Python列表语法 cleaned_str = cleaned_str.replace(' ', ',') # 用ast.literal_eval解析(比eval更安全,避免代码注入风险) pixel_list = ast.literal_eval(cleaned_str) # 转换为numpy数组 return np.array(pixel_list)
应用到DataFrame列:
# 假设你的字符串列名为'pixel_str',新数组列名为'pixel_array' df['pixel_array'] = df['pixel_str'].apply(str_to_pixel_array)
验证转换结果:
# 查看第一个转换后的数组形状 print(df['pixel_array'].iloc[0].shape) # 输出示例:(224, 224, 3) 对应224x224的RGB图像
方法2:从源头避免字符串存储(推荐)
如果你的create_data函数是生成数据集的源头,建议直接存储numpy数组而非字符串,避免后续转换麻烦:
修改create_data函数:
import os import cv2 import pandas as pd def create_data(datadir): data_records = [] # 遍历标签文件夹 for label_name in os.listdir(datadir): label_dir = os.path.join(datadir, label_name) if not os.path.isdir(label_dir): continue # 遍历文件夹内的图像 for img_filename in os.listdir(label_dir): img_path = os.path.join(label_dir, img_filename) # 读取图像为numpy数组(默认BGR,如需RGB可加[:, :, ::-1]) img_array = cv2.imread(img_path) if img_array is not None: data_records.append({ 'pixel_array': img_array, 'label': label_name }) # 创建DataFrame df = pd.DataFrame(data_records) # 用pickle保存(避免csv将数组转为字符串) df.to_pickle('image_dataset.pkl') return df
读取保存的数据集:
df = pd.read_pickle('image_dataset.pkl') # 直接使用pixel_array列的numpy数组即可
内容的提问来源于stack exchange,提问作者Nocry
相关产品推荐
相关产品推荐

