【问题标题】:numpy.save to store 3D Numpy array together with a labelnumpy.save 将 3D Numpy 数组与标签一起存储
【发布时间】:2021-03-22 09:59:51
【问题描述】:

我想将形状为 (3, 225, 400) 的 Numpy 数组写入二进制文件。

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

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 是否在保存后将文件指针移动到新行。

考虑到我将高频保存数十万个数组标签对,您对效率有何建议?

【问题讨论】:

  • bufferdtype 是什么?可能是一些数字。 label 的本质是什么?确保在保存之前查看np.append(buffer,[label])。检查形状和数据类型,以及一些值。没有办法在np.save 之前或期间向数组添加标签属性。最好将文件名用作“标签”,或者有一个单独的文件将文件名和标签配对。或者考虑使用 HDF5 文件 (h5py),它可以保存多个数组以及“标签”属性。
  • 是的,数组中充满了数值。标签的类型视情况而定。让我们暂时假设为布尔值。创建单独的文件可能效率低下,但我会看看 HDF5 文件,谢谢!
  • 标量布尔数组还是布尔数组?如果是数组,是什么形状?

标签: python performance numpy numpy-ndarray


【解决方案1】:

一种选择是保存到一个 numpy (NPZ) 文件。我在下面提供了一个示例。 np.saveznp.savez_compressed 允许将多个数组保存到一个文件中。

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)

另一种选择是通过h5py 使用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"]

【讨论】:

  • 感谢您的详细回答 jakub。据我了解,在您的第一种方法中,我们需要为每个缓冲区标签 pais 创建不同的 .npz 文件。我对吗?如果是这样,这对我来说不合适。我可以在同一个“output.npz”文件中存储多个缓冲区标签对吗?我猜HDF5系统也会出现同样的情况。
  • 您可能需要创建多个 npz 文件。但是您不需要创建多个 hdf5 文件!这是 hdf5 的一大好处。您可以将不同的缓冲区保存到不同的数据集。您打算并行编写吗?如果是这样,那么您可能需要不同的文件。如果您按顺序编写,在我看来 hdf5 将是一个不错的选择。 hdf5 的另一个好处是读取时不需要将所有数据加载到内存中。您可以读取单个数据集,甚至部分数据集。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-23
  • 2015-12-26
相关资源
最近更新 更多