Python 的 NumPy 库提供了方便的数据读写功能,针对数组数据的存储和读取。于处理大型数据集或进行科学计算时非常有用。当处理大型数据集时,使用二进制格式(.npy、.npz)通常比文本格式(.txt、.csv)更有效率。本文主要介绍Python 中Numpy 数据读写,以及相关示例代码。

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.savenumpy.savetxt 时,如果不指定扩展名,NumPy 会自动添加 .npy.txt.npy 格式是一种二进制格式,具有高效存储和快速加载的优势,同时保持数组的数据类型和形状信息。

推荐文档