基于python,numpy库如何生成npy文件?如何解析?
发布于 作者:苏南大叔 来源:程序如此灵动~
numpy库,有个自己独有的保存变量到文件的功能,特有的文件格式是.npy和.npz。两者最直观的区别,就是保存单独的变量和多个变量的区别。那么,本文描述.npy文件的生成与解析。特别需要说明的是:.npy和.npz这些都是numpy提供的功能,并不是python提供的功能。

苏南大叔的“程序如此灵动”博客,记录苏南大叔和计算机代码的故事。本文测试环境:win10,python@3.12.0,numpy@1.26.1。.save()和.load()都是有好多参数的,但是本文里面并不都做展示,因为用不到。
生成.npy文件
理论上就是把变量写入到一个临时文件里面去,变量并不局限于注册在numpy的ndarray类型,普通的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)可能存在的问题
在上面的代码中,操作的对象包括ndarray、list和str。如果换成tuple类型,则会发现np.load()回来的变量类型,被变成了ndarray。这,就似乎不符合逻辑了。经过测试:
| 原版数据类型 | save()->load() | 新版数据类型 |
|---|---|---|
| ndarray | .npy | ndarray |
| list | .npy | ndarray |
| tuple | .npy | ndarray |
| set | .npy + allow_pickle | ndarray |
| dict | .npy + allow_pickle | ndarray |
| range | .npy | ndarray |
| str | .npy | ndarray |
| int | .npy | ndarray |
测试代码:
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相关文章,请点击苏南大叔的文章: