qml.data

数据子包提供了访问、存储和操作量子数据集的功能。

注意

要开始使用数据集,请首先查看 量子数据集快速入门指南

概述

数据集通常使用 Dataset 类进行存储和访问。预计算的数据集可以下载,并可以使用 load()load_interactive() 函数进行访问。此外,用户可以使用 Dataset 类中的函数轻松创建、自定义数据集、写入磁盘和读取数据集。

attribute(val[, doc])

创建一个数据集属性,该属性包含值和相关元数据。

field([属性类型, 文档, python类型])

用于在声明式数据集上定义字段。

Dataset([bind, data_name, identifiers])

数据集的基类。

DatasetNotWriteableError(绑定)

尝试在其基础文件不可写的 数据集 上设置属性时引发的异常。

load(数据名称[, 属性, 文件夹路径, ...])

如果数据在目录中尚不存在,则下载该数据并将其作为Dataset对象的列表返回。

load_interactive()

使用交互式加载提示下载数据集。

list_attributes(data_name)

列出特定 data_name 存在的属性。

list_data_names()

获取数据类ID的列表。

list_datasets()

返回可用数据集的字典。

此外,提供了各种数据集类型

AttributeInfo([attrs_bind])

包含可以分配给数据集属性的元数据。

DatasetAttribute([值, 信息, 绑定, ...])

DatasetAttribute 类提供了一个接口,用于将 Python 对象转换为 HDF5 数组或组,以及从 HDF5 数组或组转换回 Python 对象。

DatasetArray([值, 信息, 绑定, 父项和键])

实现数组协议的对象的属性类型,包括numpy数组和pennylane.math.tensor。

DatasetScalar([值, 信息, 绑定, ...])

数字的属性类型。

DatasetString([值, 信息, 绑定, ...])

字符串的属性类型。

DatasetList([值, 信息, 绑定, 父对象和键])

为数据集属性提供类列表的集合类型。

DatasetDict([值, 信息, 绑定, 父级和键])

提供了一个类似字典的集合,用于数据集属性类型。

DatasetOperator([值, 信息, 绑定, ...])

DatasetAttribute 用于 pennylane.operation.Operator 类。

DatasetNone([值, 信息, 绑定, 父级和键])

'None' 值的数据集类型。

DatasetMolecule([值, 信息, 绑定, ...])

属性类型为 pennylane.qchem.Molecule

DatasetSparseArray([值, 信息, 绑定, ...])

Scipy稀疏数组的属性类型。

DatasetJSON([value, info, bind, parent_and_key])

用于JSON可序列化数据的数据集类型。

DatasetTuple([值, 信息, 绑定, 父级和键])

元组的类型。

数据集

Dataset 类提供了一种可移植的存储格式,用于描述物理系统及其演变的信息。例如,任意量子系统的数据集可以包含哈密顿量、其基态和该状态的有效态制备电路。数据集可以包含多种对象类型,包括:

  • numpy.ndarray

  • 任何数字类型

  • 分子

  • 大多数 Operator 类型

  • list 的任何支持类型

  • dict 任何支持的类型,只要键是字符串

有关使用数据集的更多详细信息,请参阅 量子数据集快速入门指南

创建数据集

要在内存中创建一个新的数据集,初始化一个具有所需属性的新 Dataset

>>> hamiltonian = qml.Hamiltonian([1., 1.], [qml.Z(0), qml.Z(1)])
>>> eigvals, eigvecs = np.linalg.eigh(qml.matrix(hamiltonian))
>>> dataset = qml.data.Dataset(
...   hamiltonian = hamiltonian,
...   eigen = {"eigvals": eigvals, "eigvecs": eigvecs}
... )
>>> dataset.hamiltonian
1.0 * Z(0) + 1.0 * Z(1)
>>> dataset.eigen
{'eigvals': array([-2.,  0.,  0.,  2.]),
'eigvecs': array([[0.+0.j, 0.+0.j, 0.+0.j, 1.+0.j],
   [0.+0.j, 1.+0.j, 0.+0.j, 0.+0.j],
   [0.+0.j, 0.+0.j, 1.+0.j, 0.+0.j],
   [1.+0.j, 0.+0.j, 0.+0.j, 0.+0.j]])}

实例创建后也可以分配属性:

>>> dataset.ground_state = np.transpose(eigvecs)[np.argmin(eigvals)]
>>> dataset.ground_state
array([0.+0.j, 0.+0.j, 0.+0.j, 1.+0.j])

读取和写入数据集

数据集可以保存到磁盘以供后用。数据集使用HDF5格式进行序列化,使用“.h5”文件扩展名。

要保存一个数据集,请使用 Dataset.write() 方法:

>>> my_dataset = Dataset(...)
>>> my_dataset.write("~/datasets/my_dataset.h5")

要从文件中打开数据集,请使用 Dataset.open() 类方法:

>>> my_dataset = Dataset.open("~/datasets/my_dataset.h5", mode="r")

参数 mode 遵循标准库约定 — r 用于读取,w-w 用于创建和覆盖,以及 'a' 用于编辑。open() 可用于直接在磁盘上创建新的数据集:

>>> new_dataset = Dataset.open("~/datasets/new_datasets.h5", mode="w")

默认情况下,对已打开数据集所做的任何更改将直接提交到文件中,如果文件以只读方式打开,则会失败。"copy"模式可以用来将数据集加载到内存中并将其从文件中分离:

>>> my_dataset = Dataset.open("~/dataset/my_dataset/h5", mode="copy")
>>> my_dataset.new_attribute = "abc"

重要

由于打开的数据集是从磁盘流式传输数据的,因此无法同时从分别运行的脚本或多个Jupyter笔记本访问相同的数据集。为了解决这个问题,要么在磁盘上复制数据集,要么使用 Dataset.open()mode="copy" 的方式访问数据集。

属性元数据

数据集属性还可以包含附加的元数据,例如文档字符串。 attribute() 函数可以在赋值或初始化时附加元数据。

>>> hamiltonian = qml.Hamiltonian([1., 1.], [qml.Z(0), qml.Z(1)])
>>> eigvals, eigvecs = np.linalg.eigh(qml.matrix(hamiltonian))
>>> dataset = qml.data.Dataset(hamiltonian = qml.data.attribute(
...     hamiltonian,
...     doc="The hamiltonian of the system"))
>>> dataset.eigen = qml.data.attribute(
...     {"eigvals": eigvals, "eigvecs": eigvecs},
...     doc="Eigenvalues and eigenvectors of the hamiltonian")

然后可以使用 Dataset.attr_info() 映射访问这些元数据:

>>> dataset.attr_info["eigen"]["doc"]
'Eigenvalues and eigenvectors of the hamiltonian'

声明式API

在创建数据集以建模物理系统时,通常会在不同的条件或假设下收集相同的数据。例如,一组描述量子振荡器的数据集,其中包含不同质量和力常数的前1000个能量级。

数据集声明式API允许我们创建Dataset的子类,定义所需的属性或“字段”,以及它们相关的类型和文档:

class QuantumOscillator(qml.data.Dataset, data_name="quantum_oscillator", identifiers=["mass", "force_constant"]):
    """Dataset describing a quantum oscillator."""

    mass: float = qml.data.field(doc = "The mass of the particle")
    force_constant: float = qml.data.field(doc = "The force constant of the oscillator")
    hamiltonian: qml.Hamiltonian = qml.data.field(doc = "The hamiltonian of the particle")
    energy_levels: np.ndarray = qml.data.field(doc = "The first 1000 energy levels of the system")

data_name 关键字指定数据集类型的类别或描述名称,而 identifiers 关键字用于指定作为参数的字段,即它们决定系统的行为。

当创建一个 QuantumOscillator 数据集时,其属性将具有来自字段定义的文档:

>>> dataset = QuantumOscillator(
...     mass=1,
...     force_constant=0.5,
...     hamiltonian=qml.X(0),
...     energy_levels=np.array([0.1, 0.2])
... )
>>> dataset.attr_info["mass"]["doc"]
'The mass of the particle'