You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何调整字典内列表结构以实现预期数组存储格式?

问题

我用以下代码初始化数据集字典:

train_dataset, test_dataset, valid_dataset = ({'image':[], 'mask':[]} for i in range(3))

我期望执行print(train_dataset[0])后,得到单个数组作为image和mask的值的结构(仅关注层级):

{'image': array([[[238, 238, 239, ..., 226, 227, 230],
    [234, 238, 240, ..., 226, 227, 225],
    [255, 255, 255, ..., 255, 255, 255]],
    ...,
    [255, 255, 255, ..., 255, 255, 255],
    [255, 255, 255, ..., 255, 255, 255],
    [255, 255, 255, ..., 255, 255, 255]]], dtype=uint8),  
'mask': array([[[0., 0., 0., ..., 0., 0., 0.],
    [0., 0., 0., ..., 0., 0., 0.],
    [0., 0., 0., ..., 0., 0., 0.],
    ...,
    [2, 2, 2, ..., 2, 2, 2],
    [2, 2, 2, ..., 2, 2, 2],
    [2, 2, 2, ..., 2, 2, 2]]], dtype=uint8)}

但实际得到的是数组列表作为image的值:

{'image': [array([[40, 40, 40, ..., 59, 59, 59],
    [40, 40, 40, ..., 59, 59, 59],
    [40, 40, 40, ..., 59, 59, 59],
    ...,
    [42, 42, 42, ..., 41, 41, 41],
    [42, 42, 42, ..., 41, 41, 41],
    [42, 42, 42, ..., 41, 41, 41]], dtype=uint8),  
array([[11, 11, 14, ..., 28, 34, 35],
    [11, 12, 14, ..., 27, 32, 33],
    [12, 12, 15, ..., 21, 21, 21],
    ...,
    [7, 7, 6, ..., 13, 19, 20],
    [11, 11, 8, ..., 12, 20, 21],
    [12, 12, 9, ..., 12, 20, 21]], dtype=uint8),  
array([[19, 19, 19, ..., 39, 39, 39],
    [19, 19, 19, ..., 39, 39, 39],
    [19, 19, 19, ..., 39, 39, 39],
    ...,
    [0, 0, 0, ..., 0, 0, 0],
    [0, 0, 0, ..., 0, 0, 0],
    [0, 0, 0, ..., 0, 0, 0]], dtype=uint8)]}

请问如何调整代码,使字典内的结构符合预期?

解决方案

问题出在初始化字典时,'image'和'mask'被设为了空列表,后续你应该是把多个数组追加到了列表里,导致最终是数组的列表。要达到预期结构,有两种调整方式:

方式1:直接赋值单张图片的数组

如果每个数据集字典对应单张图片的掩码对,初始化时可以把值设为None,后续填充时直接替换为数组:

# 初始化时用None占位
train_dataset, test_dataset, valid_dataset = ({'image': None, 'mask': None} for i in range(3))

# 填充数据(示例)
train_dataset['image'] = img_array  # img_array是单张图片的数组
train_dataset['mask'] = mask_array  # mask_array是对应掩码的数组

方式2:合并多个数组为多维数组

如果你的需求是把所有图片数组合并成一个多维数组(比如形状为(样本数, 高度, 宽度, 通道数)),可以先收集数组到列表,再用numpy合并:

import numpy as np

# 初始化空列表收集数组
train_dataset = {'image':[], 'mask':[]}

# 循环添加数组到列表(示例)
train_dataset['image'].append(img_array1)
train_dataset['image'].append(img_array2)
train_dataset['mask'].append(mask_array1)
train_dataset['mask'].append(mask_array2)

# 合并列表为单个数组
train_dataset['image'] = np.stack(train_dataset['image'])
train_dataset['mask'] = np.stack(train_dataset['mask'])

两种方式处理后,train_dataset['image']都会是单个数组,而非数组的列表,符合你预期的结构。

内容的提问来源于stack exchange,提问作者Wander Mendes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 21:46:06