我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

numpy库,有个自己独有的保存变量到文件的功能,特有的文件格式是.npy.npz。两者最直观的区别,就是保存单独的变量和多个变量的区别。那么,本文描述.npy文件的生成与解析。特别需要说明的是:.npy.npz这些都是numpy提供的功能,并不是python提供的功能。

苏南大叔:基于python,numpy库如何生成npy文件?如何解析? - numpy生成和解析npy文件
基于python,numpy库如何生成npy文件?如何解析?(图1-1)

苏南大叔的“程序如此灵动”博客,记录苏南大叔和计算机代码的故事。本文测试环境:win10python@3.12.0numpy@1.26.1.save().load()都是有好多参数的,但是本文里面并不都做展示,因为用不到。

生成.npy文件

理论上就是把变量写入到一个临时文件里面去,变量并不局限于注册在numpyndarray类型,普通的list/tuple/dict等等变量也是可以保存进去的。使用的函数是:np.save()。参考代码:

import numpy as np
s = ["苏", "南", "大", "叔"]
print(s,type(s))              #  苏南大叔 <class 'list'>
np.save("test.npy", s)

这里需要注意的是:

  • 生成文件必然是以.npy结尾的,代码会强制生成.npy结尾文件名称。这个是必然的。
  • 会覆盖现有同名文件,无任何提示。

解析.npy文件

解析.npy文件也非常简单,使用的函数是:np.load()。参考代码:

import numpy as np
n = np.load("test.npy")
print(n,type(n))              #  苏南大叔 <class 'numpy.ndarray'>

或者:

import numpy as np
n = np.load("test.npy",allow_pickle=True)

可能的报错

试图对set或者dict类型操作的时候,可能会得到下面的错误提示信息:

ValueError: Object arrays cannot be loaded when allow_pickle=False

测试代码:

import numpy as np
s = {"苏", "南", "大", "叔"}                # set
s = {"s":"苏","n":"南","d":"大","s2":"叔"}  # dict
np.save("test.npy", s)
n = np.load("test.npy")

解决方案【allow_pickle=True似乎万能】:

n = np.load("test.npy",allow_pickle=True)

可能存在的问题

在上面的代码中,操作的对象包括ndarrayliststr。如果换成tuple类型,则会发现np.load()回来的变量类型,被变成了ndarray。这,就似乎不符合逻辑了。经过测试:

原版数据类型save()->load()新版数据类型
ndarray.npyndarray
list.npyndarray
tuple.npyndarray
set.npy + allow_picklendarray
dict.npy + allow_picklendarray
range.npyndarray
str.npyndarray
int.npyndarray

测试代码:

import numpy as np
# s = np.array([["苏", "南", "大", "叔"]])    # ndarray
# s = ["苏", "南", "大", "叔"]                # list
# s = ("苏", "南", "大", "叔")                # tuple
# s = {"苏", "南", "大", "叔"}                # set
# s = {"s":"苏","n":"南","d":"大","s2":"叔"}  # dict
# s = "苏南大叔"                              # str
# s = 168                                    # int
s = range(0,3)                             # range
print(s,type(s))
np.save("test.npy", s)

n = np.load("test.npy",allow_pickle=True)
print(n,type(n))

目前的结论

使用np.save()几乎可以保存很多类型变量(不敢说是所有)。但是,np.load()有的时候需要配合参数allow_pickle=True才能正常解析,而且目前来看,解析出来的变量,都会被强制转为ndarray类型。所以,使用这个功能的时候,需谨慎。

因为没有实验其它参数,所以目前的结论,可能存在偏颇,待后续文章补充。

结语

更多python相关文章,请点击苏南大叔的文章:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   python