Python 将numpy阵列输入和输出到h5py

Python 将numpy阵列输入和输出到h5py,python,arrays,numpy,h5py,Python,Arrays,Numpy,H5py,我有一个Python代码,其输出是一个大小矩阵,其条目都是float类型。如果使用扩展名.dat保存,文件大小约为500 MB。我读到使用h5py可以大大减小文件大小。假设我有一个名为A的2D numpy数组。如何将其保存到h5py文件? 另外,当我需要对数组进行操作时,如何读取同一文件并将其作为不同代码中的numpy数组?h5py提供了一个数据集和组的模型。前者基本上是数组,后者可以看作是目录。每个都被命名为。您应该查看API的文档和示例: 在一个简单的示例中,您正在预先创建所有数据,并且只

我有一个Python代码,其输出是一个大小矩阵,其条目都是
float
类型。如果使用扩展名
.dat
保存,文件大小约为500 MB。我读到使用
h5py
可以大大减小文件大小。假设我有一个名为
A
的2D numpy数组。如何将其保存到h5py文件?
另外,当我需要对数组进行操作时,如何读取同一文件并将其作为不同代码中的numpy数组?

h5py提供了一个数据集和组的模型。前者基本上是数组,后者可以看作是目录。每个都被命名为。您应该查看API的文档和示例:

在一个简单的示例中,您正在预先创建所有数据,并且只想将其保存到hdf5文件,该示例如下所示:

In [1]: import numpy as np
In [2]: import h5py
In [3]: a = np.random.random(size=(100,20))
In [4]: h5f = h5py.File('data.h5', 'w')
In [5]: h5f.create_dataset('dataset_1', data=a)
Out[5]: <HDF5 dataset "dataset_1": shape (100, 20), type "<f8">

In [6]: h5f.close()
一定要查看文档:

写入hdf5文件取决于h5py或pytables(每个表都有一个位于hdf5文件规范之上的不同pythonapi)。您还应该了解numpy本机提供的其他简单二进制格式,如
np.save
np.savez
等:

要处理文件打开/关闭并避免内存泄漏,请执行以下操作:

准备:

import numpy as np
import h5py

data_to_write = np.random.random(size=(100,20)) # or some such
with h5py.File('name-of-file.h5', 'w') as hf:
    hf.create_dataset("name-of-dataset",  data=data_to_write)
with h5py.File('name-of-file.h5', 'r') as hf:
    data = hf['name-of-dataset'][:]
写入:

import numpy as np
import h5py

data_to_write = np.random.random(size=(100,20)) # or some such
with h5py.File('name-of-file.h5', 'w') as hf:
    hf.create_dataset("name-of-dataset",  data=data_to_write)
with h5py.File('name-of-file.h5', 'r') as hf:
    data = hf['name-of-dataset'][:]
阅读:

import numpy as np
import h5py

data_to_write = np.random.random(size=(100,20)) # or some such
with h5py.File('name-of-file.h5', 'w') as hf:
    hf.create_dataset("name-of-dataset",  data=data_to_write)
with h5py.File('name-of-file.h5', 'r') as hf:
    data = hf['name-of-dataset'][:]

您是如何使用
.dat
扩展名保存它的?@jorgeca:为此,我只做了
np.savetxt(“output.dat”,A,'%10.8e')
谢谢(扩展名本身并不意味着什么,它可以存储为二进制,ascii…)。除非您需要hdf5的额外功能,否则我只会使用
np.save('output.dat',A)
,它将以二进制格式保存它(速度更快,占用的空间更少)。@jorgeca但是当我将其称为
A=np.loadtxt('output.dat',unpack=True)时,另一个python脚本是否能够将其作为2D数组读取
所以
h5py
不会创建比
np更小的文件。save
会吗?是否
h5py
np快。对于问题中给出的大小的数组,保存
?顺便说一句。如果您在读取数据集时事先不知道数据集的名称,则必须解析类似于的hdf文件。@JoshAdel如果我想向数据集添加列。我的数据集是一个多维np.array,索引为[img_id,行,列,通道]。我用你答案中描述的方法保存了它。我使用h5f['dataset_1'][img_id]访问数据集中的所有点。我想要的是一种添加另一列的方法,比如“mycolumn”…对应于数据集中的每个img_id。我应该如何添加另一个列,以便我可以执行h5f['mycolumn'][img_id]?如果我这样写矩阵,那么我无法使用HDFView 2.11查看它们-我可以打开文件,我可以看到数据集
data.h5
存在,但我无法使用HDFView查看它。我可以用h5py阅读内容,但不能用HDFView检查。知道为什么吗?不需要关闭文件?@DrDeSancho No,在交互模式下运行时特别有用(因为如果在第一次尝试时没有正确关闭相同的代码而重新运行相同的代码,则可能会从h5py获得已打开文件的异常)。Python的
with
功能称为上下文管理器。它将确保文件在使用后关闭。官方文件中提供了更多信息: