直接用 np.array(dict) 失败是因为嵌套字典非 NumPy 原生支持,会退化为 dtype=object 一维数组或报 ValueError;必须先扁平化为字段对齐的字典列表并显式定义结构化 dtype。
为什么直接用
会失败
嵌套字典不是 NumPy 原生支持的输入类型,
遇到嵌套结构(比如
)会退化为
的一维数组,完全丢失结构化访问能力。更糟的是,如果各子字典字段不一致(比如有的缺
),还会触发
。
必须先扁平化再定义
元组
NumPy 结构化数组要求所有记录字段名、类型、顺序严格对齐。嵌套字典得先展开成“每行一条记录”的列表,每条记录是普通字典(非嵌套),字段名作为顶层 key。
用递归或
提取路径如
→ 改写为合法字段名
统一字段类型:数值优先用
,字符串用
(避免
)
必须是元组列表,例如
,不能传字典
构造数据时用
,
是字典列表,每个字典只含 flat 后的 key
示例:
嵌套层级深时,
字段名容易冲突或过长
比如
扁平后变成
和
—— 字段名太长不仅难读,还可能超出 NumPy 对字段名长度的隐式限制(实际影响不大,但调试时看着累)。
Python 3.14.3
微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。
下载
立即学习
“
Python免费学习笔记(深入)
”;
建议用下划线分隔 + 缩写,如
,提前约定命名规则
避免用点号(
)或空格,NumPy 字段名只支持字母、数字、下划线,且不能以数字开头
如果原始嵌套中存在动态 key(如
),必须转为固定字段(如
)或改用
列存整个子字典(牺牲结构化查询能力)
缺失值处理不当会导致
推断错误
NumPy 在构造结构化数组时,若某字段在部分记录中缺失(
或根本没出现),而你又没显式指定该字段类型,它可能把整列判为
,后续无法做数值运算。
务必在
构造阶段补全所有字段,缺失值填
(数值)、
(字符串)或
(整型)
字符串字段别用
,否则 dtype 会变成
;改用
并填空字符串
检查最终
是否全是预期类型,尤其注意有没有意外的
(object)
最易忽略的是:嵌套字典键名本身含 Unicode 或特殊字符(如中文、连字符),这些无法直接作为字段名,必须清洗 —— 不处理就报
。
np.array(dict)np.array(){"a": {"x": 1, "y": 2}, "b": {"x": 3, "y": 4}}dtype=object"y"ValueError: setting an array element with a sequencedtypejsonpath-ng"a.x""a_x"np.float64np.dtype("U32")objectdtype[("a_x", "f8"), ("a_y", "f8"), ("b_x", "f8")]np.array(data_list, dtype=dtype)data_listdata = [{"a": {"x": 1.0, "y": 2.0}, "b": {"x": 3.0}}]
flat_data = [{"a_x": 1.0, "a_y": 2.0, "b_x": 3.0, "b_y": np.nan}]
dtype = [("a_x", "f8"), ("a_y", "f8"), ("b_x", "f8"), ("b_y", "f8")]
arr = np.array(flat_data, dtype=dtype)dtype{"user": {"profile": {"name": "Alice"}, "stats": {"count": 5}}}"user_profile_name""user_stats_count""usr_prof_name".{"items": {"001": {...}, "002": {...}}}"item_001_x"objectdtypeNoneobjectflat_datanp.nan""0np.nanobjectnp.dtype("U32")arr.dtype|OValueError: illegal field name