优先用 .to_numpy(),它比 .values 更明确、更安全,从 pandas 0.24.0 起推荐使用;.values 行为不确定易引发副作用,而 .to_numpy() 默认返回副本、支持 dtype 和 na_value 参数、可处理混合类型与缺失值。

直接用 .values 还是 .to_numpy()?
优先用 .to_numpy()。它比 .values 更明确、更安全,且从 Pandas 0.24.0 开始推荐使用。.values 返回的是视图或副本取决于底层数据类型和内存布局,容易引发意外的写入副作用;而 .to_numpy() 默认返回副本,行为可预测。
-
.to_numpy()支持dtype参数强制转换类型,比如df.to_numpy(dtype="float32") -
.values在遇到混合类型(如含字符串和数字)时会退化为objectdtype,而.to_numpy()可通过na_value参数处理缺失值,例如df.to_numpy(na_value=0) - 若 DataFrame 含非数值列(如时间戳、类别型),
.to_numpy()仍会转成object数组,此时需先筛选数值列:df.select_dtypes("number").to_numpy()
如何避免 dtype 不一致导致的隐式转换?
NumPy 数组对 dtype 敏感,Pandas 自动推断的 dtype(如 Int64、boolean)在转 NumPy 时可能变成 float64 或 object,破坏精度或性能。
- 检查原始列 dtype:
df.dtypes,特别注意 nullable 类型(Int64、string、boolean) - 显式转换再转数组:
df.astype({"col1": "float32", "col2": "int32"}).to_numpy() - 对含
NaN的整数列,Pandas 用Int64存储,但 NumPy 没有原生 nullable int,.to_numpy()会转成float64;如需保持整型,先填空:df["col"].fillna(-1).astype("int32").to_numpy()
内存占用和性能差异在哪?
关键在于是否共享内存。默认 .to_numpy() 返回副本,安全但多占内存;加 copy=False 可能复用底层缓冲区,但仅当数据连续、dtype 兼容且无缺失值时才真正生效。
- 验证是否共享内存:
np.shares_memory(df.to_numpy(), df.values)—— 多数情况下返回False - 想最小化拷贝开销,先确保 DataFrame 是 C-contiguous 且 dtype 单一:
df = df.astype("float32").values.copy(order="C"),再传给计算密集型函数 - 如果后续只读,且确认数据未被修改,可用
df.to_numpy(copy=False),但必须配合np.array(..., copy=False)链式调用才可靠
遇到 ValueError: setting an array element with a sequence 怎么办?
这是最常踩的坑:DataFrame 含 list、dict 或嵌套结构(比如某列是 Python 列表),.to_numpy() 会生成 object 数组,而多数 NumPy 函数不支持 object 数组运算。
- 先检查是否有嵌套数据:
df.applymap(type).eq(list).any().any()(Pandas df.map(type).isin([list, dict]).any().any() - 展开嵌套列:用
pd.json_normalize()或df.explode("col_name"),再转数组 - 若只是单列含列表,且想转为二维数组,用
np.vstack(df["col"].tolist()),但要确保所有子列表等长
真正麻烦的不是转换动作本身,而是没意识到 DataFrame 的“结构”早已超出 NumPy 的平面假设——列类型混杂、缺失值表示不统一、内存不连续,这些都会在转数组后立刻暴露。动手前,先 df.info() 和 df.dtypes 看清底细,比写十行转换代码更重要。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











