基于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
相关文章,请点击苏南大叔的文章:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。