NumPy 中文教程

第一部分:基础认知与环境准备
第 1 章 全面认识 NumPy
第 2 章 开发环境搭建与验证
第二部分:核心对象 ——ndarray 数组
第 3 章 ndarray 数组基础
第 4 章 数组的形状与维度操作
第四部分:高级应用与数据处理
第 8 章 数组的排序、查找与去重
第 9 章 缺失值与异常值处理
第 10 章 随机数生成与抽样
第 11 章 文件读写与数据交互
第五部分:实战场景与落地应用
第 12 章 数值计算实战
第 13 章 数据分析实战
第六部分:优化进阶与问题解决
第 14 章 NumPy 性能优化
第 15 章 NumPy 进阶扩展
第 16 章 常见问题与解决方案

11.2 二进制文件读写

NumPy高级教程:二进制文件读写、.npy/.npz文件处理与压缩方法

NumPy 中文教程

本教程详细讲解NumPy中二进制文件的读写操作,包括单个数组的.npy文件和多个数组的.npz文件的保存与加载,以及如何使用compress参数进行文件压缩,帮助初学者轻松掌握高效数据存储技巧。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

NumPy二进制文件读写教程:.npy/.npz文件与压缩方法

引言

NumPy是Python中用于科学计算的核心库,它提供了高效的数组操作和文件处理功能。在数据处理中,经常需要将数组保存到文件中以便后续使用。NumPy支持多种文件格式,其中二进制文件格式如.npy和.npz是最常用的,因为它们存储效率高且加载速度快。本教程将深入讲解这些二进制文件的读写方法,包括压缩选项,适合NumPy初学者学习。

.npy文件读写:单个数组

.npy文件是NumPy专为单个数组设计的二进制格式。它保存了数组的形状、数据类型等信息,确保数据完整无损。

保存数组为.npy文件

使用numpy.save()函数可以将单个数组保存为.npy文件。语法如下:

numpy.save(file, arr, allow_pickle=True, fix_imports=True)
  • file: 文件名或文件对象(可以是带.npy扩展名的字符串)。
  • arr: 要保存的NumPy数组。
  • 其他参数通常使用默认值即可。

示例代码:

import numpy as np

# 创建一个示例数组
arr = np.array([1, 2, 3, 4, 5])

# 保存为.npy文件
np.save('my_array.npy', arr)
print("数组已保存为my_array.npy")

从.npy文件加载数组

使用numpy.load()函数可以从.npy文件加载数组。语法如下:

numpy.load(file, mmap_mode=None, allow_pickle=True, fix_imports=True, encoding='ASCII')
  • file: 文件名或文件对象。
  • 加载后直接返回数组。

示例代码:

import numpy as np

# 加载.npy文件
loaded_arr = np.load('my_array.npy')
print("加载的数组:", loaded_arr)
print("数据类型:", loaded_arr.dtype)
print("形状:", loaded_arr.shape)

.npz文件读写:多个数组

.npz文件是NumPy用于保存多个数组的压缩格式。它实际上是多个.npy文件的归档,方便存储和传输多个数据对象。

保存多个数组为.npz文件

使用numpy.savez()numpy.savez_compressed()函数。

  • numpy.savez(file, *args, **kwds): 保存多个数组,可以是位置参数或关键字参数。
  • numpy.savez_compressed(file, *args, **kwds): 同上,但启用压缩以减小文件大小。

示例代码:使用numpy.savez()

import numpy as np

# 创建多个数组
arr1 = np.array([1, 2, 3])
arr2 = np.array([[4, 5], [6, 7]])

# 保存为.npz文件
np.savez('my_arrays.npz', array1=arr1, array2=arr2)  # 使用关键字参数
# 或使用位置参数:np.savez('my_arrays.npz', arr1, arr2)
print("多个数组已保存为my_arrays.npz")

示例代码:使用numpy.savez_compressed()

import numpy as np

arr1 = np.array([1, 2, 3])
arr2 = np.array([[4, 5], [6, 7]])

# 保存为压缩的.npz文件
np.savez_compressed('my_arrays_compressed.npz', a=arr1, b=arr2)
print("压缩的多个数组已保存为my_arrays_compressed.npz")

从.npz文件加载数组

同样使用numpy.load()函数,但返回一个类字典对象(NpzFile),可以通过键访问各个数组。

示例代码:

import numpy as np

# 加载.npz文件
loaded_data = np.load('my_arrays.npz')

# 访问数组
print("数组1:", loaded_data['array1'])  # 使用保存时的键
print("数组2:", loaded_data['array2'])

# 如果使用位置参数保存,可以通过索引访问,如loaded_data['arr_0']

# 加载压缩文件
loaded_compressed = np.load('my_arrays_compressed.npz')
print("压缩数组a:", loaded_compressed['a'])
print("压缩数组b:", loaded_compressed['b'])

二进制文件的压缩(compress参数)

NumPy提供了压缩选项来减小.npz文件的大小,这对于大型数据集特别有用。压缩通过numpy.savez_compressed()函数实现,它内部使用ZIP压缩算法。

如何使用压缩

  • 使用numpy.savez_compressed()函数时,压缩是自动启用的,无需额外参数。
  • numpy.savez()相比,numpy.savez_compressed()生成的文件更小,但保存和加载速度可能稍慢,因为涉及压缩和解压缩过程。

示例代码:比较压缩效果

import numpy as np
import os

# 创建一个大型数组用于测试
large_arr = np.random.rand(1000, 1000)  # 1000x1000的随机数组

# 保存为普通.npz文件
np.savez('large_array.npz', data=large_arr)
# 保存为压缩.npz文件
np.savez_compressed('large_array_compressed.npz', data=large_arr)

# 比较文件大小
size_normal = os.path.getsize('large_array.npz')
size_compressed = os.path.getsize('large_array_compressed.npz')
print(f"普通文件大小: {size_normal} 字节")
print(f"压缩文件大小: {size_compressed} 字节")
print(f"压缩率: {(size_normal - size_compressed) / size_normal * 100:.2f}%")

# 加载压缩文件以确保数据完整
loaded_compressed = np.load('large_array_compressed.npz')
print("加载的压缩数组形状:", loaded_compressed['data'].shape)

压缩的优势和注意事项

  • 优势:节省存储空间,便于传输大数据集。
  • 注意事项:压缩和解压缩会增加CPU开销,因此在对速度要求高的场景下需权衡。建议根据数据大小和性能需求选择是否启用压缩。

总结

本教程详细介绍了NumPy中二进制文件的读写方法,包括单个数组的.npy文件和多个数组的.npz文件。通过numpy.save()numpy.load()函数,可以轻松保存和加载数据。对于多个数组,使用numpy.savez()numpy.savez_compressed(),后者提供了压缩功能以优化存储。压缩通过compress参数(在numpy.savez_compressed()中内置)实现,适合处理大型数据集。建议初学者多实践这些操作,以提升数据管理效率。

通过掌握这些技巧,您可以在项目中高效地处理NumPy数组的持久化存储。如有疑问,请参考NumPy官方文档或尝试更多示例代码。

开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包