在数据分析、科学计算和机器学习中,常常需要将数组数据保存到磁盘文件,或从文件中读取数据。NumPy 提供了一组用于数组文件读写(file I/O)的函数,用于在 NumPy 数组(ndarray)与外部文件之间进行数据转换。

这些函数支持多种数据格式,包括:

• NumPy 二进制格式(.npy)

• 多数组压缩格式(.npz)

• 文本格式(.txt / .csv)

按照功能划分,NumPy 的文件读写函数通常可以分为四类:

(1)NumPy 二进制文件读写

(2)多数组压缩文件读写

(3)文本文件读写

(4)原始二进制文件读写

一、NumPy 二进制文件读写(.npy)

NumPy 提供 .npy 文件格式,用于保存单个数组。

这种格式可以完整保存:

字节顺序(endianness)

因此读取速度非常快,并且可以精确恢复原数组结构。

save()

将数组保存为 .npy 文件。

numpy.save(file, arr)

参数说明:

• file:文件名或文件对象

• arr:需要保存的数组

示例:

np.save("data.npy", a)

保存后生成文件:data.npy。

load()

从 .npy 文件读取数组。

numpy.load(file, allow_pickle=False)

参数说明:

• file:文件名或文件对象

• allow_pickle:是否允许加载 Python 对象。出于安全考虑,NumPy 默认禁止加载 pickle 数据

示例:

print(data)

输出:

 [4 5 6]]

二、NumPy 多数组文件读写(.npz)

当需要保存多个数组时,可以使用 .npz 文件。

.npz 文件本质上是一个 ZIP 压缩归档文件,其中每个成员文件都是 .npy 格式的数组文件。

1、保存 .npz 文件

savez()

保存多个数组到 .npz 文件。

numpy.savez(file, *arrays, **kwds)

参数说明:

• file:输出文件名

• arrays:未命名数组

• kwds:带名称的数组

示例:

np.savez("arrays.npz", a=a, b=b)

savez_compressed()

保存压缩 .npz 文件。

numpy.savez_compressed(file, *arrays, **kwds)

示例:

np.savez_compressed("arrays_compressed.npz", a=a, b=b)

该函数使用 ZIP 压缩来减少文件体积。

2、读取 .npz 文件

示例:

data["b"]

当读取 .npz 文件时,numpy.load() 返回一个 numpy.lib.npyio.NpzFile 对象,其行为类似只读字典,可以通过键访问其中保存的数组。

三、文本文件读写

NumPy 也支持将数组保存为文本格式,例如 .txt 或 .csv。

savetxt()

将数组写入文本文件。

numpy.savetxt(fname, X, fmt="%.18e", delimiter=" ")

参数说明:

• fname:输出文件名

• X:输入数组

• fmt:数据格式

• delimiter:字段分隔符

示例:

np.savetxt("data.txt", a, delimiter=",")

输出文件内容:

4,5,6

loadtxt()

从文本文件读取数据。

              skiprows=0, usecols=None)

参数说明:

• fname:文件名

• dtype:数据类型

• delimiter:字段分隔符

• skiprows:跳过的行数

• usecols:读取的列

示例 1:

data = np.loadtxt("data.txt", delimiter=",")

输出:

 [4. 5. 6.]]

示例 2:选择指定列

                  usecols=(0,2))

输出:

 [4. 6.]]

当文本文件包含多列不同类型的数据时,可以读取为结构化数组(structured array)。

示例数据(默认按空白字符分隔各列):

3 鞠子舟 78

读取:

data = np.loadtxt("students.txt", dtype=dtype)

输出结构:

      dtype=[('id',' ), ( 'name', ' ), ( 'score', ' )])

说明:每一列会映射为结构化数组中的一个字段。

genfromtxt()

genfromtxt() 是更通用的文本读取函数。

numpy.genfromtxt(fname, delimiter=",", dtype=None)

特点:

• 支持缺失值

• 自动推断数据类型

• 支持字段名称

因此,当文本数据格式不完全规整或包含缺失值时,genfromtxt() 通常比 loadtxt() 更合适。

示例:

data = np.genfromtxt("data.csv", delimiter=",", names=True)

说明:当 names=True 时,第一行会作为字段名。

四、原始二进制文件读写

除了 .npy 与 .npz 格式外,NumPy 还提供原始二进制文件读写函数。这种方式直接读写数组的二进制数据流,不包含数组结构信息。

因此在读取时通常需要手动指定数据类型(dtype)和形状(shape)。

fromfile()

从二进制文件读取数组数据。

numpy.fromfile(file, dtype=float, count=-1, sep='')

参数说明:

• file:文件名或文件对象

• dtype:读取的数据类型

• count:读取元素数量

• sep:字段分隔符。默认为空字符串("")表示按二进制方式读取;若指定分隔符,则按文本方式解析

示例:

print(data)

输出:

[1 2 3 4]

tofile()

将数组写入二进制文件。

ndarray.tofile(file, sep="", format="%s")

参数说明:

• file:输出文件名

• sep:字段分隔符(空字符串表示二进制写入)

• format:输出格式

示例:

a.tofile("numbers.bin")

说明:该函数会将数组数据按原始字节序列写入文件。

该函数通常与 fromfile() 配合使用,但读取时需要手动提供正确的 dtype,必要时还需自行恢复形状。

小结

NumPy 提供了一组用于数组文件读写的函数体系。.npy 格式(save、load)用于高效存储单个数组,.npz 格式(savez、savez_compressed)用于保存多个数组并支持压缩存储。文本读写函数(savetxt、loadtxt、genfromtxt)可用于与 CSV 或文本数据交换。此外,fromfile 与 tofile 提供原始二进制数据读写能力。这些工具使数组数据能够在磁盘与内存之间高效转换,是数据分析与科学计算中的基础工具。

点赞有美意,赞赏是鼓励