0
点赞
收藏
分享

微信扫一扫

NumPy 的文件输入输出

输入和输出

一、NumPy 读写二进制文件

1. 将数组保存到二进制文件中

  • numpy.save(file, arr, allow_pickle=True, fix_imports=True)
    将一个数组以二进制的形式保存到 .npy 的形式。
    参数:
    • filefile-object, str, or pathlib.Path
      数据将被保存到这个文件中。
      如果 filefile-object,则文件名不变;
      如果 filestr or pathlib.Path,则将会在文件名后添加后缀名 “.npy”;
    • arrarray_like
      将被保存的数组。
    • allow_picklebool, optional
      允许使用 Python pickle 保存对象数组,默认为 True。不使用 pickle 的原因可能是安全性和可以执行的问题。
    • fix_importsbool, optional
      仅在强制 Python3 上的对象数组中的对象以与 Python2 兼容的方式进行 pickle 时有用。如果 fix_importsTruepickle 将尝试将新的 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 filefile-object, str, or pathlib.Path
      数据将被保存到这个文件中。
      如果 filefile-object,则文件名不变;
      如果 filestr 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 filefile-object, str, or pathlib.Path
      数据将被保存到这个文件中。
      如果 filefile-object,则文件名不变;
      如果 filestr 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 , .npzpickled 文件中加载数组或 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,加载对象数组将失败。默认值:False
    • fix_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 and footer前面的字符串,用于标记,默认为 “# ”。
    • 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,包括注释,默认为:0
    • usecols: 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')])

举报

相关推荐

0 条评论