NumPy:将二进制文件读入现有数组

问题描述

给定一个数值的二进制文件,我可以使用 numpy.fromfile() 读取它。这将为数据分配一个新数组。假设我已经有一个数组 a 并且我想读入这个数组。我不得不做类似的事情

import numpy as np

size       = 1_000_000_000
size_chunk = 1_000_000
a = np.empty(size,dtype=np.double)
with open('filename','rb') as f:
    tmp = np.fromfile(f,dtype=np.double,count=size_chunk)
a[:size_chunk] = tmp

使事情变得普遍的地方 a 大于读入 tmp 的数据。我想通过直接读入 tmp 来避免由 a 引起的内存损失。请注意,虽然

a[:size_chunk] = np.fromfile(f,count=size_chunk)

隐藏tmp变量,不必要的临时内存还在。

我想像这样

np.fromfile(f,count=size_chunk,into=a[:chunk_size])

虽然没有实现这样的 into 关键字。

我怎样才能做到这一点?我也愿意使用 SciPy 或其他 Python 包。我会注意到 H5Py 包有一个 read_direct() 可以满足我的要求,除了我的数据文件是原始二进制文件而不是 HDF5 格式。

解决方法

我正在阅读有关 https://letsencrypt.org/docs/client-options/ 的文章,它提到了 buffer protocol;对于此类问题,SO 上有几个问题,例如 readinto,其中一些建议使用 readinto


原始答案:虽然这应该可以通过自定义 C 扩展实现,但这也是一种矫枉过正。

我认为单独使用 numpy 是不可能的,您必须进行自己的 C 扩展。我查看了 1 所以可能有一些我遗漏的东西,但是按照设计,python 会为你的缓冲区分配内存,如果 numpy 开发人员尊重这个设计选择,那么除了编写你自己的 C 扩展之外没有什么可做的支持这种情况。