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

重新加载数据时如何保留numpy数组的数据类型?

问题:保存含NumPy数组的DataFrame时保留原数据类型

假设你创建了包含NumPy数组列的DataFrame:

import numpy as np
import pandas as pd

data = {'col_1': [np.array([1,2,3])], 'col_2': 3}
x = pd.DataFrame.from_dict(data)

随后将其写入CSV文件,再重新导入:

filename = 'test.csv'
x.to_csv(filename)
x2 = pd.read_csv('test.csv')

此时打印该NumPy数组的类型:

print(type(x2.iloc[0,2]))

返回结果是<class 'str'>而非NumPy数组。请问能否避免这种情况保留NumPy数组类型?比如使用Pickle替代CSV?或者写入文件后重新加载时数据类型总会丢失?


解决方案

  • CSV无法直接保留NumPy数组类型:CSV是纯文本格式,会把所有非基础数据类型(包括NumPy数组)自动转换成字符串存储,重新读取时只能解析为字符串,没法自动还原成NumPy数组。如果非要用CSV,得手动做序列化和反序列化:存的时候把数组转成统一格式的字符串(比如np.array2string(arr, separator=',')),读的时候再用np.fromstring解析成数组,但这种方法麻烦,还容易在数组结构复杂时出错,不推荐。

  • 用Pickle直接保存DataFrame:这是最直接的方案,Pickle是Python的序列化格式,能完整保留对象的所有类型信息,包括DataFrame里的NumPy数组。使用方法很简单:

    # 保存
    x.to_pickle('test.pkl')
    # 读取
    x2 = pd.read_pickle('test.pkl')
    # 验证类型
    print(type(x2.iloc[0,1]))  # 返回 <class 'numpy.ndarray'>
    

    注意:Pickle仅适用于Python环境,跨语言兼容性差,且不要加载来源不明的Pickle文件,存在安全风险。

  • 其他替代格式:

    • Feather:专为Python/R设计的快速序列化格式,支持保留复杂数据类型,读写速度快,适合小到中等数据量的跨语言场景。
    • Parquet:列式存储格式,压缩率高,适合大数据场景,同样能完整保留数据类型。

这些二进制格式都能直接保留NumPy数组的类型,不需要手动转换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 00:35:19