二进制文件
- save(filename, arr):
将一个numpy的多维数组保存为npy格式的二进制文件,第一行以文本形式保存了数组的源信息,如ndim,dtype,shape - savez(filename, *args, **kwds):
将多个bumpy的多维数组保存为多个npy文件的压缩文件格式npz - load():
识别npz文件,返回类似字典的对象,可通过矩阵名获取数组的内容
# 尝试save()
import numpy as np # 导包
outfile = r'.\test.npy' # 写出的文件名,r表示不对转义字符组合进行转义
np.random.seed(20200619)
x = np.random.uniform(0, 1, [3, 5]) # 3*5的矩阵,元素为均匀分布的随机数
np.save(outfile, x) # 保存成文件
y = np.load(outfile) # 读取文件
print(y)
运行结果:
# 尝试savez()
import numpy as np
outfile = r'.\test.npz'
x = np.linspace(0, np.pi, 5)
y = np.sin(x)
z = np.cos(x)
np.savez(outfile, x, y, z_d=z) # 数组x,y使用了默认的名字,z使用了命名参数作为名字
data = np.load(outfile) # 加载npz文件
np.set_printoptions(suppress=True) # 设置打印格式选项,这里强制使用小数点形式
print(data.files) # 打印包含的数组名
print(data['arr_0'])
print(data['arr_1'])
print(data['z_d'])
运行结果:
文本文件
numpy.savetxt(fname, X, fmt='%.18e', delimiter=' ', newline='\n', header='', footer='', comments='# ', encoding=None)
- fname:文件名,文件路径
- X:存入文件的数组、
- fmt:写入文件中的每个字符串的字符串格式
- delimiter:字符串分割符
numpy.loadtxt(fname, dtype=float, comments='#', delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0, encoding='bytes', max_rows=None)
- fname:同上
- dtype:numpy数据类型
- comments:字符串或字符串组成的列表,默认为# , 表示注释字符集开始的标志
- skiprows:跳过前面多少行
- usecols:元组, 用来指定要读取数据的列(第一列为0)
- unpack:当加载多列数据时是否需要将数据列进行解耦赋值给不同的变量
# 读写txt文件
import numpy as np
outfile = './test.txt'
x = np.arange(0, 10).reshape(2, 5) # 重塑,2*5矩阵
np.savetxt(outfile, x)
y = np.loadtxt(outfile)
print(y)
# 读写csv文件
import numpy as np
outfile = './test.csv'
x = np.arange(0, 10, 0.5).reshape(4, 5)
np.savetxt(outfile, x, fmt='%.3f', delimiter=',')
y = np.loadtxt(outfile, delimiter=',')
print(y)
文本格式选项
numpy.set_printoptions(precision=None,threshold=None, edgeitems=None,linewidth=None, suppress=None, nanstr=None, infstr=None,formatter=None, sign=None, floatmode=None, **kwarg)
- precision:设置精度,控制输出小数位
- threshold:概略显示,超过该值以“…”显示
- linewidth:每行多少字符后换行
- suppress:为真时,不以科学计数法表示
- nanstr:Not a number,一种特殊的数,默认为“nan”
- infstr:无穷大,一种特殊的数,默认为“inf”
import numpy as np
np.set_printoptions(precision=4) # 精度设为4
x = np.array([1.123456789]) # 转为numpy格式的数组
print(x)
np.set_printoptions(threshold=20) # 每行20个字符
x = np.arange(50) # 序列
print(x)
np.set_printoptions(threshold=np.iinfo(np.int).max) # np.int的最大值
print(x)
eps = np.finfo(float).eps # epsilon,意为很小很小的数,趋近于零
x = np.arange(4.)
x = x ** 2 - (x + eps) ** 2
print(x)
np.set_printoptions(suppress=True)
print(x)
x = np.linspace(0, 10, 10)
print(x)
np.set_printoptions(precision=2, suppress=True, threshold=5)
print(x)
练习
只打印或显示numpy数组rand_arr的小数点后3位:
- rand_arr = np.random.random([5, 3])
np.set_printoptions(precision=3)
将numpy数组a中打印的项数限制为最多6个元素:
a = np.arange(0, 100)
np.set_printoptions(threshold=6)
打印完整的numpy数组a而不中断:
np.set_printoptions(threshold=np.iinfo(a.dtype).max)
总结
python的函数的一大特点是控制参数很多,很多时候要自己去查阅文档了解参数的含义。