1、二进制文件读写
NumPy提供了几种处理二进制文件的方法,允许高效地读写大型数组数据。方法如下,
1)保存数组到二进制文件
numpy.save(file, arr, allow_pickle=True, fix_imports=True): 将数组保存到以.npy
扩展名的二进制文件中。file
是文件路径或类似文件的对象,arr
是要保存的数组。
import numpy as np # 创建一个 NumPy 数组 a = np.array([1, 2, 3, 4, 5]) # 将数组保存到文件 np.save("data.npy", a) with open("data.npy", "rb") as file: content = file.read() print(content)
2)加载二进制文件的数组
numpy.load(file, mmap_mode=None, allow_pickle=True, fix_imports=True, encoding='ASCII'): 从.npy
或.npz
文件中加载数组。file
可以是文件路径、URL或类似文件的对象。
import numpy as np # 创建一个 NumPy 数组 a = np.array([1, 2, 3, 4, 5]) # 将数组保存到文件 np.save("data.npy", a) with open("data.npy", "rb") as file: content = file.read() print(content) # 从文件中读取数组 b = np.load("data.npy") print(b)
3)保存多个数组到一个文件
numpy.savez(file, *args, **kwds): 以未压缩的.npz
格式保存多个数组。可以通过关键字参数为数组命名。
numpy.savez_compressed(file, *args, **kwds): 功能同numpy.savez
,但以压缩格式保存。
import numpy as np arr1 = np.array([1, 2, 3]) arr2 = np.array([4, 5, 6]) np.savez('my_arrays.npz', array1=arr1, array2=arr2) with open("my_arrays.npz", "rb") as file: content = file.read() print(content)
4)读取多个数组
numpy.savez:将多个数组保存到一个以 .npz
格式的压缩文件中。使用numpy.load
并从 .npz
文件中提取数组。
import numpy as np arr1 = np.array([1, 2, 3]) arr2 = np.array([4, 5, 6]) np.savez('my_arrays.npz', array1=arr1, array2=arr2) with open("my_arrays.npz", "rb") as file: content = file.read() print(content) # 从文件中读取数组 b = np.load("my_arrays.npz") print(b['array1']) print(b['array2'])
2、文本文件读写
loadtxt
函数用于从文本文件中读取 NumPy 数组。savetxt
函数用于将 NumPy 数组保存到文本文件中。
1)写入文本文件
numpy.savetxt(fname, X, fmt='%.18e', delimiter=' ', newline='\n', header='', footer='', comments='# '): 将数组写入文本文件。fname
是文件名或文件对象,X
是要保存的数组,fmt
是格式化字符串,delimiter
指定列与列之间的分隔符。
import numpy as np arr = np.array([[1, 2, 3], [4, 5, 6]]) np.savetxt('my_data.txt', arr, delimiter=',') with open("my_data.txt", "r") as file: content = file.read() print(content)
2)读取文本文件
numpy.loadtxt(fname, dtype=float, comments='#', delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0): 从文本文件中加载数据。fname
可以是文件名或文件对象,dtype
指定数组数据类型。
import numpy as np arr = np.array([[1, 2, 3], [4, 5, 6]]) np.savetxt('my_data.txt', arr, delimiter=',') with open("my_data.txt", "r") as file: content = file.read() print(content) loaded_arr = np.loadtxt('my_data.txt', delimiter=',') print(loaded_arr)
3、高级文件操作
umpy.genfromtxt:从文本文件中加载数据,并处理缺失值。适用于加载复杂或不规则的数据集。
numpy.genfromtxt(fname, dtype=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=None, replace_space='_', autostrip=False, case_sensitive=True, defaultfmt='f%i', unpack=None, usemask=False, loose=True, invalid_raise=True, max_rows=None, encoding='bytes')
参数说明:
参数 | 说明 |
fname | 要读取的文件、文件名或生成器。 |
dtype | 数据类型,默认为float。 |
comments | 注释字符,默认为'#'。 |
delimiter | 分隔符,默认为任何空格。 |
skip_header | 跳过文件开头的行数,默认为0。 |
skip_footer | 跳过文件末尾的行数,默认为0。 |
converters | 将数据列转换为特定类型的函数的字典。 |
missing_values | 指定缺失数据的规则。 |
filling_values | 用于替代缺失值的值。 |
usecols | 指定需要读取哪些列的整数或整数序列。 |
names | 设置为True时将第一行作为列名,或提供字符串列表作为列名。 |
excludelist | 指定需要排除的列名列表。 |
deletechars | 删除字段名中的特定字符。 |
replace_space | 用于替换字段名中的空格字符。 |
autostrip | 是否自动去除字段值前后的空格。 |
case_sensitive | 指定字段名的大小写敏感性。 |
defaultfmt | 当没有指定列名时,用于自动生成列名的格式。 |
unpack | 如果为True,返回的数组将被转置,即行变为列。 |
usemask | 如果为True,返回一个掩码数组。 |
loose | 如果为True,则会宽松解析非形式化的数字字符串。 |
invalid_raise | 如果为True,对于不符合规定的行将引发异常。 |
max_rows | 读取的最大行数。 |
encoding | 指定文件编码。 |
代码如下,
import numpy as np # 创建一个文本文件 with open("data.txt", "w") as f: f.write("1 2 3 4 5\n") f.write("6 7 8 9 10\n") # 读取数据 a = np.genfromtxt("data.txt", dtype=int) print(a) # 创建一个文本文件 with open("data.txt", "w") as f: f.write("1,2,3,4,5\n") f.write("6,7,8,9,10\n") f.write("11,12,13,14,15\n") f.write("16,17,18,19,20\n") # 读取数据,指定分隔符为逗号 a = np.genfromtxt("data.txt", dtype=int, delimiter=",") print(a) # 创建一个文本文件 with open("data.txt", "w") as f: f.write("1 2 3 4 5\n") f.write("6 7 8 9 10\n") f.write("* 注释\n") # 读取数据,指定注释符号为 `*` a = np.genfromtxt("data.txt", dtype=int, comments="*") print(a) # 创建一个文本文件 with open("data.txt", "w") as f: f.write("1 2 3 4 5\n") f.write("6 7 8 9 NA\n") # 读取数据,指定缺失值为 -1 a = np.genfromtxt("data.txt", dtype=int, filling_values=-1) print(a)
注意:
在使用 numpy.save
和 numpy.savetxt
时,如果不指定扩展名,NumPy 会自动添加 .npy
或 .txt
。.npy
格式是一种二进制格式,具有高效存储和快速加载的优势,同时保持数组的数据类型和形状信息。