numpy 输入与输出
import numpy as np
numpy.save : 以二进制文件的方式保存array,文件格式为.npy
numpy.save(file, arr, allow_pickle=True, fix_imports=True)
参数:
file: file, str, or pathlib.Path
将数据保存到的文件或文件名。 如果file是文件对象,则文件名不变。 如果文件是字符串或路径,则.npy扩展名将附加到文件名(如果尚无扩展名)。
arr: array_like
array data to be saved
allow_pickle: bool, optional
是否允许以python pickle的方式保存对象数组
fix_imports: bool, optional
如果fix_imports为True,则pickle将尝试将新的Python 3名称映射到Python 2中使用的旧模块名称,以便pickle数据流可被Python 2读取。
注:保存到文件的所有数据都将附加到文件末尾。
from tempfile import TemporaryFile
outfile = TemporaryFile()
x = np.arange(10)
np.save(outfile, x, allow_pickle=True)
# 模拟关闭和重新打开文件
_ = outfile.seek(0)
np.load(outfile)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
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)
print(a, b)
[1 2] [1 3]
numpy.load: 从.npy .npz 或pickled files的文件中导入数组或者pickled对象
numpy.load(file,mmap_mode=None,allow_pickle=False,fix_import=True,encoding=‘ASCII’)
参数
file:file-like object, string, or pathlib.Path
要读取的文件。文件类的对象要支持seek()和read()方法,pickled files要求文件类的对象也要支持readline()
mmap_mode: {None,‘r+’,‘r’,‘w+’,‘c’}, optional
如果不为None,则使用给定的模式对文件进行内存映射(有关模式的详细说明,请参见numpy.memmap)。内存映射的阵列保留在磁盘上。但是,可以像访问任何ndarray一样对其进行访问和切片。内存映射对于访问大文件的小片段而不将整个文件读入内存特别有用。
allow_pickle: bool, optional
若为True,则允许加载存储在npy文件中的pickled对象数组。因为加载pickled数据,里面的任何内容都会执行,所以出于安全的考虑会禁用。如果禁用,导入对象数组会失败。从numpy1.16.3版本开始,默认为False。
fix_imports: bool, optional
和上述numpy.save中相应的参数相同
encoding: str, optional
读取python2字符串时使用哪种编码文件,仅当python3导入python2产生的pickled文件时有效。只允许使用’ASCII’, ‘bytes’, ‘latin1’。默认为’ASCII’
Returns:
result: array, tuple, dict, etc. 对于.npz文件,必须关闭返回的NpzFile类,以免造成文件泄露,推荐使用with。
np.save('./tmp/123', np.array([[1, 2, 3], [4, 5, 6]]))
np.load('./tmp/123.npy')
array([[1, 2, 3],
[4, 5, 6]])
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.close()
numpy.savez: 将多个数组保存到一个文件中。如果传入的参数没有关键字,则.npz文件中的相应变量名称为’arr_0’,'arr_1’等。如果给出了关键字参数,则.npz文件中的相应变量名称将与 关键字名称。
numpy.savez(file, *args, **kwds)
参数
file: str or file
文件名
args: Arguments, optional
要保存到文件的数组。由于Python不可能知道savez之外的数组的名称,因此将使用名称"arr_0",“arr_1”, 等保存数组。这些参数可以是任何表达式。
kwds: Keyword arguments, optional
保存到文件的数组。
注:.npz文件格式是以文件中包含的变量命名的压缩文件存档。归档文件未压缩,并且归档文件中的每个文件都包含一个.npy格式的变量。当加载npz文件时,会返回一个类似于字典的对象。
from tempfile import TemporaryFile
outfile = TemporaryFile()
x = np.arange(10)
y = np.sin(x)
np.savez(outfile, x, y)
_ = outfile.seek(0)
npzfile = np.load(outfile)
npzfile.files
['arr_0', 'arr_1']
npzfile['arr_0']
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
outfile = TemporaryFile()
np.savez(outfile, x=x, y=y)
_ = outfile.seek(0)
npzfile = np.load(outfile)
npzfile['x'], npzfile['y']
(array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]),
array([ 0. , 0.84147098, 0.90929743, 0.14112001, -0.7568025 ,
-0.95892427, -0.2794155 , 0.6569866 , 0.98935825, 0.41211849]))
文本文件
numpy.savetxt, numpy.loadtxt, numpy.genfromtxt可以存储和读取文本文件(如:txt, csv等)
numpy.savetxt: 保存数组到txt文件
numpy.savetxt(fname, X, fmt=’%.18e’,delimiter=’ ‘, newline=‘n’, header=’’, footer=’’, comment=’#’, encoding=None)
参数
fname: filename or file handle
要保存的文件名,如果文件名以.gz结尾,则文件自动保存成gzip压缩格式
X: 1D or 2D array_like
要保存的数据
fmt: str or sequence of strs, optional
-: 左对齐
+: 强制在结果前面加’+‘和’-’
0: 用数字而不是空格左键填充数字(请参见宽度)。
width: 最少要打印的字符数,如果该值包含更多字符,则不会被截断。
precision: 整数:最小位数。科学记数法:小数点后的位数。字符串:长度。
c: 字符
d or i: 有符号十进制数
e or E: 科学记数法
f: 十进制浮点数
g,G: 科学记数法,浮点数的有效位数
o: 八进制
s: 字符串
u: 无符号十进制整数
x,X: 无符号十六进制整数
delimiter: str, optional
用于分割字符串,默认为空格
newline: str, optional
用于分隔行
header: str optional
写在文件开头的字符串
footer: str, optional
写在文件结尾的字符串
comments: str, optional
添加到header和footer之前的内容,标记其为注释,默认为’#’
encoding: {None, str}, optional
输出文件的编码方式,默认为’latin1’
x = y = z = np.arange(0.0, 5.0, 1.0)
np.savetxt('./tmp/test.out', x, fmt='%1.4e', delimiter='**',newline='\n%%%\n')
0.0000e+00
%%%
1.0000e+00
%%%
2.0000e+00
%%%
3.0000e+00
%%%
4.0000e+00
%%%
numpy.loadtxt(fname, dtype=<class ‘float’>, comments=’#’, delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0, encoding=‘bytes’, max_rows=None)
参数
fname: file,str,or pathlib.Path
文件名
dtype:data-type, optional
结果数组的类型,默认为float。如果是结构化的数据类型,则结果数组将是一维的,并且每一行将被解释为数组的元素。这种情况下,使用的列数必须与数据类型中的字段数匹配。、
comments: str or sequence of str, optional
用于指示注释开始的字符或字符列表。None表示没有,默认是’#’
delimiter: str, optional
用于分隔值的字符串,默认是空格
converters: dict, optional
将列号映射到函数的字典,该函数会将列字符串解析为所需的值。可以为缺失值提供一个默认的值。
skiprows: int, optional
跳过多少行,一般为第一行,包括表头,默认为0
usecols: int or sequence, optional
要读取的列,第一列为0。例如,usecols =(1,4,5)将提取第二,第五和第六列。
unpack: bool, optional
当加载多列数据时是否需要将数据列进行解耦赋值给不同的变量。
ndmin: int, optional
返回的数组将至少具有ndmin维。合法值:0(默认),1或2。
max_rows: int, optional
读取多少行(不包括跳过的行数),默认读取所有的行
from io import StringIO
c = StringIO("0 1\n2 3")
np.loadtxt(c)
array([[0., 1.],
[2., 3.]])
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')])
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.]))
numpy.genfromtxt(fname, dtype=<class ‘float’>, comments=’#’, delimiter=None, skip_header=0, skip_footer=0, converters=None, missing_values=None, filling_values=None, usecols=None, names=None, excludelist=None, deletechars=" !#$%&’()*+, -./:;<=>?@[]^{|}~", replace_space=’_’, autostrip=False, case_sensitive=True, defaultfmt=‘f%i’, unpack=None, usemask=False, loose=True, invalid_raise=True, max_rows=None, encoding=‘bytes’)
部分参数与numpy.loadtxt相似
delimiter: str,int,or sequence, optional
用于分隔值的字符串。 默认情况下,任何连续的空格都用作分隔符。 也可以提供整数或整数序列作为每个字段的宽度。
names: {None, True, str, sequence}, optional
如果names为True,则从第一行skip_header行之后的第一行读取字段名称。如果名称是序列或逗号分隔的名称的单字符串,则这些名称将用于定义结构化dtype中的字段名称
skiprows 在1.10版本中移除了,可使用skip_header替换
s = StringIO(u"1,1.3,abcde")
data = np.genfromtxt(s, dtype=[('myint','i8'),('myfloat','f8'),('mystring','S5')],delimiter=",")
data
array((1, 1.3, b'abcde'),
dtype=[('myint', '<i8'), ('myfloat', '<f8'), ('mystring', 'S5')])
numpy.set_printoptions(precision=None, threshold=None, edgeitems=None, linewidth=None, suppress=None, nanstr=None, infstr=None, formatter=None, sign=None, floatmode=None, *, legacy=None)
参数
precision: int or None, optional
float的输出精度,默认为8
threshold: int, optional
触发概括打印而不是完整输出的数组元素总数(默认为1000)。
linewidth: bool, optional
用于插入换行符的每行字符数(默认为75)。
suppress: bool,optional
如果为True,则始终使用定点表示法打印浮点数,在这种情况下,当前精度中等于零的数字将打印为零。 如果为False,则当最小数的绝对值<1e-4或最大绝对值与最小值之比> 1e3时使用科学计数法。 默认值为False。
nanstr: str,optional
浮点非数字的字符串表示形式,默认nan。
infstr: str,optional
浮点无穷的字符串表示形式,默认为inf
sign: string,either’-’,’+’,or’’,optional
控制浮点类型符号的打印。 如果为"+",请始终打印正值的符号。如果为" “,则始终在正值的正负号位置打印一个空格(空白字符)。 如果为“-”,请省略正值的符号字符。(默认为”-")
np.set_printoptions(precision=4)
np.array(1.123456789)
array(1.1235)
np.set_printoptions(threshold=6)
np.arange(10)
array([0, 1, 2, ..., 7, 8, 9])
eps = np.finfo(float).eps
x = np.arange(4.)
x**2-(x+eps)**2
array([-4.9304e-32, -4.4409e-16, 0.0000e+00, 0.0000e+00])
np.set_printoptions(suppress=True)
x**2-(x+eps)**2
array([-0., -0., 0., 0.])