You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 22:15:29