我最近遇到了numpy.savez和numpy.savez_compresseed.两者似乎都能很好地处理不同类型的数组,包括对象array.但是,numpy.load不能很好地与对象类型数组配合使用.例如:

import numpy as np

numbers = np.full((10, 1), np.pi)
strings = np.full((10, 1), "letters", dtype=object)

np.savez("test.npz", numbers=numbers, strings=strings)

data = np.load("test.npz")

调用data["strings"]会引发以下ValueError:

ValueError: Object arrays cannot be loaded when allow_pickle=False

但是,在numpy.load上启用PICLE可以解决此问题.numpy.saveznumpy.savez_compressed文档中没有讨论Pickle……这让我想知道为什么需要Pickle来加载数据.numpy.saveznumpy.savez_compressed会在幕后自动使用泡菜吗?

推荐答案

因为您有dtype=object个这样的代码,所以将使用Pickle(序列化Python对象).

默认情况下,保存时允许使用PICLE序列化,但加载时必须显式请求反序列化PICLE.这是因为加载Pickle数据可能会执行任意代码,对于不受信任的输入,这将是一个安全问题.

Python相关问答推荐

我从带有langchain的mongoDB中的vector serch获得一个空数组

在Python中处理大量CSV文件中的数据

numpy卷积与有效

Pandas:将多级列名改为一级

DataFrames与NaN的条件乘法

海上重叠直方图

所有列的滚动标准差,忽略NaN

如何使用scipy的curve_fit与约束,其中拟合的曲线总是在观测值之下?

如何启动下载并在不击中磁盘的情况下呈现响应?

如何使用OpenGL使球体遵循Python中的八样路径?

Cython无法识别Numpy类型

如果包含特定值,则筛选Groupby

GPT python SDK引入了大量开销/错误超时

在极点中读取、扫描和接收有什么不同?

如何使用matplotlib查看并列直方图

你能把函数的返回类型用作其他地方的类型吗?'

我可以不带视频系统的pygame,只用于游戏手柄输入吗?''

提取最内层嵌套链接

如果不使用. to_list()[0],我如何从一个pandas DataFrame中获取一个值?

FileNotFoundError:[WinError 2]系统找不到指定的文件:在os.listdir中查找扩展名