如何用NumPy创建可重复结构的大二进制文件内存映射?
解决numpy内存映射重复结构的问题
要实现类似Matlab memmapfile.m 的功能,读取从偏移量511开始、重复799次(原第一条加798次)的(2,1) float结构,按以下步骤操作:
核心思路
单个(2,1) float结构的字节数为 2 * 8 = 16(默认float为64位,即8字节),总共有799个这样的连续结构,只需在np.memmap中指定总形状即可一次性映射所有记录。
代码实现
方式1:直接映射为多维数组(简洁版)
import numpy as np fileName = "你的二进制文件路径" total_records = 799 # 1条初始记录 + 798条重复记录 # 映射为(799, 2)的数组,等价于保留(2,1)形状的(799,2,1) mmap = np.memmap( fileName, dtype=np.float64, # 明确指定64位浮点数,避免平台差异 mode='r', offset=511, shape=(total_records, 2) ) # 访问第k条记录(k从0到798):mmap[k] 会得到一个长度为2的数组
如果需要严格保留(2,1)的二维形状,只需将shape改为(total_records, 2, 1)。
方式2:用结构化dtype模拟字典定义(更贴近Matlab风格)
如果需要明确用字典式的结构定义,可以创建结构化数据类型:
import numpy as np fileName = "你的二进制文件路径" total_records = 799 # 定义结构化dtype,对应"dtype=float, shape=(2,1)"的结构 record_dtype = np.dtype([('data', np.float64, (2, 1))]) mmap = np.memmap( fileName, dtype=record_dtype, mode='r', offset=511, shape=(total_records,) ) # 访问第k条记录的(2,1)数组:mmap[k]['data']
注意事项
- 确保文件总字节数足够:
511 + total_records * 16不能超过文件实际大小,否则会抛出内存映射越界错误。 - 如果你的二进制文件使用32位float(4字节),需将
np.float64改为np.float32,并重新计算单个结构字节数为2*4=8。
内容的提问来源于stack exchange,提问作者Michelle
相关产品推荐
相关产品推荐

