如何仅加载numpy二进制文件中的连续切片元素?
读取二进制numpy数组的指定连续切片内容
要直接读取二进制文件中数组的[a:b]切片,核心是利用文件的偏移量定位和指定读取数量,下面是两种实用方法:
方法一:直接用np.fromfile的参数实现
np.fromfile本身支持offset(文件偏移字节数)和count(读取元素个数)参数,步骤如下:
- 确定数组元素的字节大小:比如
np.float32每个元素占4字节 - 计算文件偏移量:从文件开头跳过
a * 元素字节数的位置 - 计算要读取的元素总数:
b - a
示例代码:
import numpy as np # 设置切片范围 a = 5000 # 起始索引 b = 8000 # 结束索引(不包含) # 获取数据类型的字节大小 item_size = np.dtype(np.float32).itemsize # 计算文件偏移量 offset = a * item_size # 要读取的元素数量 read_count = b - a # 读取指定切片 target_slice = np.fromfile('filename.dat', dtype=np.float32, offset=offset, count=read_count)
方法二:手动操作文件指针读取
如果需要更灵活的文件操作,可以用Python内置的文件操作函数配合np.frombuffer:
import numpy as np a = 5000 b = 8000 item_size = np.dtype(np.float32).itemsize read_bytes = (b - a) * item_size with open('filename.dat', 'rb') as f: # 将文件指针移动到目标切片的起始位置 f.seek(a * item_size) # 读取对应字节数的二进制数据 raw_data = f.read(read_bytes) # 将二进制数据转换为numpy数组 target_slice = np.frombuffer(raw_data, dtype=np.float32)
注意事项
- 必须保证读取时的
dtype和保存数组时的类型完全一致,否则会出现数据错乱 - 用
array.tofile()保存的是数组的连续内存块,所以上述方法完全适用;如果是其他非连续方式保存的数组,需要额外处理内存布局问题
内容的提问来源于stack exchange,提问作者Ramufasa
相关产品推荐
相关产品推荐

