Python numpy.save可将三维numpy阵列与标签一起存储

Python numpy.save可将三维numpy阵列与标签一起存储,python,performance,numpy,numpy-ndarray,Python,Performance,Numpy,Numpy Ndarray,我想将形状为(3225400)的Numpy数组写入一个二进制文件 这些数组基本上是使用屏幕缓冲区生成的,每个屏幕都有一个标签。我的目标是保存每个屏幕及其标签 save只接收两个参数:要保存的文件指针和数组。唯一的选项似乎是将标签添加到数组,如下所示: with open(file, 'wb') as f: np.save(f, np.append(buffer, [label]) ) 然而,我不喜欢这样。另一种方法可能是只保存数组,然后像常规二进制写入一样写入“\t label”: wi

我想将形状为(3225400)的Numpy数组写入一个二进制文件

这些数组基本上是使用屏幕缓冲区生成的,每个屏幕都有一个标签。我的目标是保存每个屏幕及其标签

save只接收两个参数:要保存的文件指针和数组。唯一的选项似乎是将标签添加到数组,如下所示:

with open(file, 'wb') as f:
   np.save(f, np.append(buffer, [label]) )
然而,我不喜欢这样。另一种方法可能是只保存数组,然后像常规二进制写入一样写入“\t label”:

with open(file, 'wb') as f:
   np.save(f, buffer)
   f.write("\t" + label)
我不确定np.save是否在保存后将文件指针移动到新行


考虑到我将以较高的频率保存数十万个阵列标签对,您认为在效率方面有什么建议?

一个选项是保存到numpy(NPZ)文件。我在下面举了一个例子。并允许将多个数组保存到一个文件中

import numpy as np

# Create fake data.
rng = np.random.RandomState(0)
buffer = rng.normal(size=(3, 225, 400))
label = "this is the label"

# Save. Can use np.savez here instead.
np.savez_compressed("output.npz", buffer=buffer, label=label)

# Load.
npzfile = np.load("output.npz")

np.testing.assert_equal(npzfile["buffer"], buffer)
np.testing.assert_equal(npzfile["label"], label)

另一个选项是使用HDF5。HDF5文件的组织类似于文件系统(根目录为
/
,可以使用
/data/buffers/dataset1
等名称创建数据集)。组织缓冲区和标签的一种方法是为每个缓冲区创建一个数据集,并在其上设置标签属性

import h5py
import numpy as np

# Create fake data.
rng = np.random.RandomState(0)
buffer = rng.normal(size=(3, 225, 400))
label = "this is the label"

this_dataset = "/buffers/0"

# Save to HDF5.
with h5py.File("output.h5", "w") as f:
    f.create_dataset(this_dataset, data=buffer, compression="lzf")
    f[this_dataset].attrs.create("label", label)

# Load.
with h5py.File("output.h5", "r") as f:
    loaded_buffer = f[this_dataset]
    loaded_label = f[this_dataset].attrs["label"]

缓冲区的
数据类型是什么?可能是一些数字。标签的性质是什么?保存前,请确保查看
np.append(buffer,[label])
。检查形状和数据类型,以及一些值。在
np.save
之前或期间,都没有向数组添加标签属性的方法。最好将文件名用作“标签”,或者使用一个单独的文件将文件名和标签配对。或者研究使用HDF5文件(
h5py
),该文件可以保存多个数组以及“标签”属性。是的,数组中充满了数值。标签的类型取决于具体情况。现在让我们假设为布尔型。创建单独的文件可能效率低下,但我会看看HDF5文件,谢谢!标量布尔数组还是布尔数组?如果是数组,什么形状?谢谢你的详细回答。据我所知,在第一种方法中,我们需要为每个缓冲区标签PAI创建不同的.npz文件。我说得对吗?如果是这样,这对我来说就不合适了。我可以在同一个“output.npz”文件中存储多个缓冲区标签对吗?我猜在HDF5系统中也会发生同样的情况。您可能需要创建多个npz文件。但您不需要创建多个hdf5文件!这是hdf5的最大好处之一。您可以将不同的缓冲区保存到不同的数据集。你打算并行写作吗?如果是这样,那么您可能需要不同的文件。如果你是按顺序写的,我觉得hdf5是个不错的选择。hdf5的另一个好处是,在读取时不需要将所有数据加载到内存中。您可以读取单个数据集,甚至部分数据集。