输入和输出
一、NumPy 读写二进制文件
1. 将数组保存到二进制文件中
numpy.save(file, arr, allow_pickle=True, fix_imports=True)
将一个数组以二进制的形式保存到.npy
的形式。
参数:file
:file-object, str, or pathlib.Path
数据将被保存到这个文件中。
如果file
是file-object
,则文件名不变;
如果file
是str or pathlib.Path
,则将会在文件名后添加后缀名 “.npy”;arr
:array_like
将被保存的数组。allow_pickle
:bool, optional
允许使用Python pickle
保存对象数组,默认为True
。不使用pickle
的原因可能是安全性和可以执行的问题。fix_imports
:bool, optional
仅在强制Python3
上的对象数组中的对象以与Python2
兼容的方式进行pickle
时有用。如果fix_imports
为True
,pickle
将尝试将新的Python 3
名称映射到Python 2
中使用的旧模块名称,这样pickle
数据流就可以用Python 2
读取。
>>> with open('test.npy', 'wb') as f:
np.save(f, np.array([1, 2]))
np.save(f, np.array([1, 3]))
>>> with open('test.npy', 'rb') as f:
a = np.load(f)
b = np.load(f)
>>> a, b
(array([1, 2]), array([1, 3]))
numpy.savez(file, *args, **kwds)
将多个数组以未压缩格式保存到单个.npz
的格式文件。
参数:file
:str or file
,file-object, str, or pathlib.Path
数据将被保存到这个文件中。
如果file
是file-object
,则文件名不变;
如果file
是str or pathlib.Path
,则将会在文件名后添加后缀名 “.npz”;args
:Arguments, optional
将被保存到文件的数组,每个数组将被默认键名为 “arr_0”, “arr_1”;kwds
:Keyword arguments, optional
键值对数组,给定了数组的键名。
>>> outfile = TemporaryFile()
>>> np.savez(outfile, x=x, y=y)
>>> _ = outfile.seek(0)
>>> npzfile = np.load(outfile)
>>> sorted(npzfile.files)
['x', 'y']
>>> npzfile['x']
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
numpy.savez_compressed(file, *args, **kwds)
将多个数组以压缩格式保存到单个.npz
的格式文件。
参数:file
:str or file
,file-object, str, or pathlib.Path
数据将被保存到这个文件中。
如果file
是file-object
,则文件名不变;
如果file
是str or pathlib.Path
,则将会在文件名后添加后缀名 “.npz”;args
:Arguments, optional
将被保存到文件的数组,每个数组将被默认键名为 “arr_0”, “arr_1”;kwds
:Keyword arguments, optional
键值对数组,给定了数组的键名。
>>> test_array = np.random.rand(3, 2)
>>> test_vector = np.random.rand(4)
>>> np.savez_compressed('/tmp/123', a=test_array, b=test_vector)
>>> loaded = np.load('/tmp/123.npz')
>>> print(np.array_equal(test_array, loaded['a']))
True
>>> print(np.array_equal(test_vector, loaded['b']))
True
2. 从二进制文件中读取数组
-
numpy.load(file, mmap_mode=None, allow_pickle=False, fix_imports=True, encoding='ASCII')
从.npy
,.npz
或pickled
文件中加载数组或pickled
对象。
参数:file
:file_like object, string, or pathlib.Path
读取的文件。
file_like
对象必须支持seek()
和read()
方法,必须以二进制模式打开。
pickle
文件要求file_like
对象也支持readline()
方法。mmap_mode
:{None, ‘r+’, ‘r’, ‘w+’, ‘c’}, optional
如果没有,则使用给定模式对文件进行内存映射(有关模式的详细说明,请参阅numpy.memmap)。内存映射阵列保存在磁盘上。然而,它可以像任何ndarray一样被访问和切片。内存映射对于在不将整个文件读入内存的情况下访问大文件的小片段特别有用。allow_pickle
:bool, optional
允许加载存储在npy文件中的pickle对象数组。不允许pickle的原因包括安全性,因为加载pickle数据可能会执行任意代码。如果不允许pickle,加载对象数组将失败。默认值:Falsefix_imports
:bool, optional
仅在Python3上加载Python2生成的pickle文件时有用,其中包括包含对象数组的npy/npz文件。如果fix_imports为True,pickle将尝试将旧的Python 2名称映射到Python 3中使用的新名称。encoding
:str, optional
读取Python 2字符串时使用的编码。只有在Python3中加载Python2生成的pickle文件时才有用,其中包括包含对象数组的npy/npz文件。不允许使用“latin1”、“ASCII”和“bytes”以外的值,因为它们可能会损坏数字数据。默认值:“ASCII”
返回:
Returns
:array, tuple, dict, etc
存储在文件中的数据。
# 读取 '.npy'文件
>>> np.save('/tmp/123', np.array([[1, 2, 3], [4, 5, 6]]))
>>> np.load('/tmp/123.npy')
array([[1, 2, 3],
[4, 5, 6]])
# 读取 '.npz'文件,最后需关闭NpzFile类实例
>>> a=np.array([[1, 2, 3], [4, 5, 6]])
>>> b=np.array([1, 2])
>>> np.savez('/tmp/123.npz', a=a, b=b)
>>> data = np.load('/tmp/123.npz')
>>> data['a']
array([[1, 2, 3],
[4, 5, 6]])
>>> data['b']
array([1, 2])
>>> data.close()
二、NumPy 读写文本文件(txt, csv)
1. 向文本中保存数组
numpy.savetxt(fname, X, fmt='%.18e', delimiter=' ', newline='\n', header='', footer='', comments='# ', encoding=None)
保存一个数组到text
文件中。
参数:fname
:filename or file handle
如果文件名以.gz
结尾,文件将自动以压缩gzip
格式保存。使用loadtxt
来解gzipped
文件。X
:1D or 2D array_like
该数据将被保存到text
文件。fmt
:str or sequence of strs, optional
a single specifier, fmt='%.4e'
,格式为(%s+%sj)’ % (fmt, fmt)
a full string specifying every real and imaginary part
,例如:' %.4e %+.4ej %.4e %+.4ej %.4e %+.4ej'
a list of specifiers
,实部和虚部必须有单独的说明符,例如:['%.3e + %.3ej', '(%.15e%+.15ej)']
delimiter
:str, optional
字符串或字符分隔列。newline
:str, optional
字符串或字符分隔行。header
:str, optional
将会被写入文件开始的字符串。footer
:str, optional
将会被写入文件最后的字符串。comments
:str, optional
将会被添加到header
andfooter
前面的字符串,用于标记,默认为 “# ”。encoding
:{None, str}, optional
用于对输出文件进行编码,默认为 :‘latin1’。
2. 从文本中加载数据
numpy.loadtxt(fname, dtype=<class 'float'>, comments='#', delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0, encoding='bytes', max_rows=None, *, quotechar=None, like=None)
从text
文件中读取数据。
参数:fname
:file, str, pathlib.Path, list of str, generator
要读取的文件、文件名、列表或生成器。
如果文件的扩展名为.gz or .bz2
,首先解压缩文件。
生成器必须返回字节或字符串。
列表中的字符串或生成器生成的字符串被视为行。dtype
:data-type, optional
结果数组的数据类型。
如果是结构化数据类型,结果数组将会是一维的,每行将被被视为数组的一个元素;列数必须与数据类型中的字段数匹配。comments
:str or sequence of str or None, optional
用于指示注释开头的字符或字符列表,默认是:"#"。delimiter
:str, optional
用于分隔的字符串,默认为 " "。converters
:dict or callable, optional
将列字符串解析为所需值的函数,或将列数转换为解析函数的字典。skiprows
:int, optional
跳过第一个 skiprows lines,包括注释,默认为:0usecols
:int or sequence, optional
要读取的列,0是第一列,如:usecols = (1, 3, 5)。unpack
:bool, optional
如果为True,则会对返回的数组进行转置,以便使用x,y,z=loadtxt(…)解压参数。
当与结构化数据类型一起使用时,会为每个字段返回数组。默认值为False。ndmin
:int, optional
返回的数组将至少具有ndmin
的维度。
合法值:0(默认),1 ,2。encoding
:str, optional
用于解码输入文件的编码。默认:bytes
。max_rows
:int, optional
读取最大行数,默认读取全部行。quotechar
:unicode character or None, optional
用于表示引用项的开始和结束的字符。在带引号的项目中,分隔符或注释字符的出现将被忽略。默认值为quotechar=None
.like
:array_like, optional
import numpy as np
from io import StringIO
# 读取文本
>>> d = StringIO("M 21 72\nF 35 58")
>>> np.loadtxt(d, dtype={'names': ('gender', 'age', 'weight'),
'formats': ('S1', 'i4', 'f4')})
array([(b'M', 21, 72.), (b'F', 35, 58.)],
dtype=[('gender', 'S1'), ('age', '<i4'), ('weight', '<f4')])
# delimiter, usecols, unpack参数的使用
>>> c = StringIO("1,0,2\n3,0,4")
>>> x, y = np.loadtxt(c, delimiter=',',usecols=(0, 2), >>> unpack=True)
>>> x, y
(array([1., 3.]), array([2., 4.]))
# converters 参数, 列处理函数
>>> s = StringIO("1.618, 2.296\n3.141, 4.669\n")
>>> conv = {
0: lambda x: np.floor(float(x)), # conversion fn for column 0
1: lambda x: np.ceil(float(x)), # conversion fn for column 1
}
>>> np.loadtxt(s, delimiter=",", converters=conv)
array([[1., 3.],
[3., 5.]])
# quotechar 参数
>>> s = StringIO('"alpha, #42", 10.0\n"beta, #64", 2.0\n')
>>> dtype = np.dtype([("label", "U12"), ("value", float)])
>>> np.loadtxt(s, dtype=dtype, delimiter=",", quotechar='"')
array([('alpha, #42', 10.), ('beta, #64', 2.)],
dtype=[('label', '<U12'), ('value', '<f8')])