第十章:NumPy 的文件输入输出


文档摘要

第十章:NumPy 的文件输入输出 第十章:NumPy 的文件输入输出 NumPy 提供了多种方法来保存和加载数组数据,这对于数据持久化、数据共享以及在不同程序之间传递数据至关重要。本章将深入探讨 NumPy 中的文件输入输出功能,包括文本文件的读写、NumPy 专用的二进制文件格式以及内存映射文件。 10.1 NumPy 文件输入输出概述 NumPy 提供了以下几种主要的文件输入输出方法: 和 : 用于读写简单的文本文件,适用于存储二维数组。 和 : 用于以 NumPy 专用的二进制格式 保存和加载单个数组,可以高效地存储任意形状和数据类型的数组。 和 : 用于将多个数组保存到一个 压缩文件中,方便组织和共享多个相关数组。

第十章:NumPy 的文件输入输出

第十章:NumPy 的文件输入输出

NumPy 提供了多种方法来保存和加载数组数据,这对于数据持久化、数据共享以及在不同程序之间传递数据至关重要。本章将深入探讨 NumPy 中的文件输入输出功能,包括文本文件的读写、NumPy 专用的二进制文件格式以及内存映射文件。

10.1 NumPy 文件输入输出概述

NumPy 提供了以下几种主要的文件输入输出方法:

  • numpy.savetxt()numpy.loadtxt(): 用于读写简单的文本文件,适用于存储二维数组。

  • numpy.save()numpy.load(): 用于以 NumPy 专用的二进制格式 .npy 保存和加载单个数组,可以高效地存储任意形状和数据类型的数组。

  • numpy.savez()numpy.load(): 用于将多个数组保存到一个 .npz 压缩文件中,方便组织和共享多个相关数组。

  • numpy.memmap(): 用于创建内存映射文件,允许像操作普通数组一样操作存储在磁盘上的大型数据集,而无需将整个文件加载到内存中。

10.2 文本文件的读写:loadtxt()savetxt()

numpy.loadtxt()numpy.savetxt() 是读写简单文本文件的便捷方法。它们适用于数据以规则的行和列排列,且数据类型一致的情况。

10.2.1 numpy.loadtxt()

loadtxt() 函数用于从文本文件中加载数据并创建 NumPy 数组。

语法:

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: 数据类型,默认为 float

  • comments: 用于指示注释的字符串,默认为 #

  • delimiter: 分隔符,默认为任何空白字符。

  • skiprows: 跳过开头的行数。

  • usecols: 读取哪些列,可以是列索引的元组或列表。

  • unpack: 如果为 True,则解包数组,例如将列分配给不同的变量。

示例:

import numpy as np # 创建一个示例文本文件 data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) np.savetxt('data.txt', data, fmt='%d', delimiter=',') # 从文本文件加载数据 loaded_data = np.loadtxt('data.txt', delimiter=',', dtype=int) print(loaded_data) # 输出: # [[1 2 3] # [4 5 6] # [7 8 9]] # 使用 usecols 读取特定列 loaded_data_cols = np.loadtxt('data.txt', delimiter=',', dtype=int, usecols=(0, 2)) print(loaded_data_cols) # 输出: # [[1 3] # [4 6] # [7 9]] # 使用 skiprows 跳过第一行 with open('data.txt', 'r') as f: header = f.readline() # 读取第一行 loaded_data_skip = np.loadtxt('data.txt', delimiter=',', dtype=int, skiprows=1) # 跳过第一行 print(f'header:{header}') print(loaded_data_skip) # 输出: # header:1,2,3 # [[4 5 6] # [7 8 9]]

10.2.2 numpy.savetxt()

savetxt() 函数用于将数组保存到文本文件中。

语法:

numpy.savetxt(fname, X, fmt='%.18e', delimiter=' ', newline='\n', header='', footer='', comments='# ', encoding=None)

常用参数:

  • fname: 文件名或打开的文件对象。

  • X: 要保存的数组。

  • fmt: 格式字符串,用于指定数据的保存格式,例如 '%d' (整数), '%.2f' (两位小数的浮点数)。

  • delimiter: 分隔符,默认为空格。

  • header: 文件的头部注释。

  • footer: 文件的尾部注释。

  • comments: 用于添加注释的字符串,默认为 #

示例:

import numpy as np data = np.array([[1.1, 2.2, 3.3], [4.4, 5.5, 6.6]]) # 保存到文本文件,使用逗号分隔,保留两位小数 np.savetxt('data.csv', data, delimiter=',', fmt='%.2f', header='Column 1,Column 2,Column 3', comments='# ') # 保存到文本文件,使用制表符分隔,整数格式 np.savetxt('data.txt', data, delimiter='\t', fmt='%d')

10.3 NumPy 专用的二进制文件格式:save()load()savez()

numpy.save()numpy.load()numpy.savez() 函数用于以 NumPy 专用的二进制格式保存和加载数组。这种格式可以高效地存储任意形状和数据类型的数组,并且保留了数组的元数据信息。

10.3.1 numpy.save()

save() 函数用于将单个数组保存到 .npy 文件中。

语法:

numpy.save(file, arr, allow_pickle=True, fix_imports=True)

参数:

  • file: 文件名或打开的文件对象。

  • arr: 要保存的数组。

  • allow_pickle: 是否允许使用 pickle 保存对象数组,默认为 True。 出于安全考虑,加载来源不明的 .npy 文件时,应将此参数设置为 False

示例:

import numpy as np data = np.array([[1, 2, 3], [4, 5, 6]]) # 保存到 .npy 文件 np.save('data.npy', data)

10.3.2 numpy.load()

load() 函数用于从 .npy 文件加载数组。

语法:

numpy.load(file, mmap_mode=None, allow_pickle=True, fix_imports=True, encoding='ASCII')

参数:

  • file: 文件名或打开的文件对象。

  • mmap_mode: 内存映射模式,用于加载大型文件,可选值包括 None, 'r+', 'r', 'w+', 'c'

  • allow_pickle: 是否允许使用 pickle 加载对象数组,默认为 True。 出于安全考虑,加载来源不明的 .npy 文件时,应将此参数设置为 False

示例:

import numpy as np # 从 .npy 文件加载数据 loaded_data = np.load('data.npy') print(loaded_data) # 输出: # [[1 2 3] # [4 5 6]]

10.3.3 numpy.savez()numpy.savez_compressed()

savez() 函数用于将多个数组保存到一个 .npz 压缩文件中。 savez_compressed() 使用压缩算法,可以减小文件大小。

语法:

numpy.savez(file, *args, **kwds) numpy.savez_compressed(file, *args, **kwds)

参数:

  • file: 文件名或打开的文件对象。

  • *args: 要保存的数组,可以使用位置参数或关键字参数指定数组名。

  • **kwds: 要保存的数组,使用关键字参数指定数组名。

示例:

import numpy as np a = np.array([[1, 2], [3, 4]]) b = np.array([1.1, 2.2, 3.3, 4.4]) # 使用位置参数保存多个数组 np.savez('data.npz', a, b) # 使用关键字参数保存多个数组 np.savez('data2.npz', array1=a, array2=b) # 加载 .npz 文件 loaded_data = np.load('data.npz') print(loaded_data.files) # 查看包含的数组名 # 输出: ['arr_0', 'arr_1'] print(loaded_data['arr_0']) # 访问第一个数组 # 输出: # [[1 2] # [3 4]] print(loaded_data['arr_1']) # 访问第二个数组 # 输出: [1.1 2.2 3.3 4.4] loaded_data2 = np.load('data2.npz') print(loaded_data2.files) # 查看包含的数组名 # 输出: ['array1', 'array2'] print(loaded_data2['array1']) # 访问第一个数组 # 输出: # [[1 2] # [3 4]] print(loaded_data2['array2']) # 访问第二个数组 # 输出: [1.1 2.2 3.3 4.4] loaded_data.close() # 释放资源 loaded_data2.close() # 释放资源

10.4 内存映射文件:memmap()

numpy.memmap() 函数用于创建内存映射文件。内存映射文件允许像操作普通数组一样操作存储在磁盘上的大型数据集,而无需将整个文件加载到内存中。这对于处理超出可用内存容量的数据集非常有用。

语法:

numpy.memmap(filename, dtype=np.uint8, mode='r+', offset=0, shape=None, order='C')

参数:

  • filename: 文件名。

  • dtype: 数据类型。

  • mode: 文件模式,'r+' (读写), 'r' (只读), 'w+' (创建并读写), 'c' (复制-写入)。

  • offset: 文件中的偏移量(字节)。

  • shape: 数组的形状。

  • order: 数组的存储顺序,'C' (行优先), 'F' (列优先)。

示例:

import numpy as np # 创建一个大型数组并保存到磁盘 data = np.arange(1, 10000001, dtype=np.int64) np.save('large_data.npy', data) # 创建内存映射文件 mm = np.memmap('large_data.npy', dtype=np.int64, mode='r', shape=data.shape) # 访问内存映射文件中的数据 print(mm[0]) # 输出: 1 print(mm[9999999]) # 输出: 10000000 # 修改内存映射文件中的数据 mm[0] = 100 print(mm[0]) # 输出: 100 # 从磁盘加载数据以验证更改 loaded_data = np.load('large_data.npy') print(loaded_data[0]) # 输出: 100

注意事项:

  • 修改内存映射文件会直接修改磁盘上的文件。

  • 使用完毕后,应显式关闭内存映射文件,释放资源。

10.5 总结

NumPy 提供了丰富的文件输入输出功能,可以满足各种数据存储和加载的需求。loadtxt()savetxt() 适用于简单的文本文件,save()load()savez() 适用于 NumPy 专用的二进制文件,memmap() 适用于处理大型数据集。根据实际情况选择合适的方法,可以提高数据处理的效率和灵活性。

选择合适的 NumPy 文件输入输出方法取决于以下因素:

  • 数据格式: 文本文件或二进制文件。

  • 数据大小: 小文件或大文件。

  • 数据类型: 单一数据类型或多种数据类型。

  • 是否需要压缩: 是否需要减小文件大小。

  • 是否需要随机访问: 是否需要像操作普通数组一样随机访问数据。

熟练掌握 NumPy 的文件输入输出功能,可以有效地管理和利用数据,为科学计算和数据分析提供强大的支持。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U