我有一个多维数组与numpy保存,只想部分加载一些维度,因为数组非常大.
我怎么能以简单的方式做到这一点?
编辑:上下文简单而基本:
你有5 Gb数组保存numpy.save
.但是,您只需要访问数组的某些部分A[:,:]
而无需在内存中加载5gb.
答案是:h5py
用于部分保存/加载数据:这里代码示例:
import sys import h5py def main(): data = read() if sys.argv[1] == 'x': x_slice(data) elif sys.argv[1] == 'z': z_slice(data) def read(): f = h5py.File('/tmp/test.hdf5', 'r') return f['seismic_volume'] def z_slice(data): return data[:,:,0] def x_slice(data): return data[0,:,:]
hpaulj.. 5
你必须故意保存数组以进行部分加载; 你不能一般地做.
例如,您可以拆分数组(沿着其中一个维度)并保存子数组savez
. load
这样的文件存档是'懒惰的',只读你要求的子文件.
h5py
是一个附加包,用于保存和加载HDF5文件中的数据.这允许部分读取.
numpy.memmap
是另一种选择,将文件视为存储数组的内存.
查看这些文档,以及之前的SO问题.
如何有效地读取和写入太大而无法放入内存的文件?
numpy数组最快的保存和加载选项
使用h5py编写大型hdf5数据集
详细说明搁置.有一些小问题尚不清楚."加载某些维度"究竟是什么意思?最简单的解释是你想要A[0,...]
或A[3:10,...]
.另一个是"简单方式"的含义.这是否意味着你已经拥有了一种复杂的方式,而这更简单了?或者只是你不想重写numpy.load
函数来完成任务?
否则我认为问题相当清楚 - 简单的答案是 - 没有一个简单的方法.
我很想重新开启这个问题,以便其他经验丰富的numpy
海报可以权衡.
我应该查看load
文档(OP应该也有!).如ali_m
评论所述,存在存储器映射模式.文档说:
mmap_mode:{无,'r +','r','w +','c'},可选
If not None, then memory-map the file, using the given mode (see `numpy.memmap` for a detailed description of the modes). A memory-mapped array is kept on disk. However, it can be accessed and sliced like any ndarray. Memory mapping is especially useful for accessing small fragments of large files without reading the entire file into memory.
numpy如何处理mmap的npz文件? (我在几个月前挖了这个,但忘记了选项.)
Python内存映射
你必须故意保存数组以进行部分加载; 你不能一般地做.
例如,您可以拆分数组(沿着其中一个维度)并保存子数组savez
. load
这样的文件存档是'懒惰的',只读你要求的子文件.
h5py
是一个附加包,用于保存和加载HDF5文件中的数据.这允许部分读取.
numpy.memmap
是另一种选择,将文件视为存储数组的内存.
查看这些文档,以及之前的SO问题.
如何有效地读取和写入太大而无法放入内存的文件?
numpy数组最快的保存和加载选项
使用h5py编写大型hdf5数据集
详细说明搁置.有一些小问题尚不清楚."加载某些维度"究竟是什么意思?最简单的解释是你想要A[0,...]
或A[3:10,...]
.另一个是"简单方式"的含义.这是否意味着你已经拥有了一种复杂的方式,而这更简单了?或者只是你不想重写numpy.load
函数来完成任务?
否则我认为问题相当清楚 - 简单的答案是 - 没有一个简单的方法.
我很想重新开启这个问题,以便其他经验丰富的numpy
海报可以权衡.
我应该查看load
文档(OP应该也有!).如ali_m
评论所述,存在存储器映射模式.文档说:
mmap_mode:{无,'r +','r','w +','c'},可选
If not None, then memory-map the file, using the given mode (see `numpy.memmap` for a detailed description of the modes). A memory-mapped array is kept on disk. However, it can be accessed and sliced like any ndarray. Memory mapping is especially useful for accessing small fragments of large files without reading the entire file into memory.
numpy如何处理mmap的npz文件? (我在几个月前挖了这个,但忘记了选项.)
Python内存映射