保存 awkward1 数组字典的最佳方法?
Best way to save a dict of awkward1 arrays?
所以回到尴尬的 v0 是可以做到的;
import awkward
dog = awkward.fromiter([[1., 2.], [5.]])
cat = awkward.fromiter([[4], [3]])
dict_of_arrays = {'dog': dog, 'cat': cat}
awkward.save("pets.awkd", dict_of_arrays)
然后我们可以延迟加载数组
reloaded_data = awkward.load("pets.awkd")
# no data in ram
double_dog = reloaded_data["dog"]*2
# dog is in ram but not cat
简而言之,有一个由 'dog' 和 'cat' 部分组成的数据集。
整个数据集保存到磁盘上的一个文件中。
即使我没有任何文档,也很明显什么数据是狗什么是猫。 Dog 和 cat 作为笨拙的数组加载。
我可以加载数据并只使用一部分,而另一部分不会进入 ram。
我正在寻找在尴尬的 v1 中执行此操作的最佳方法。
我想满足的要求是;
- 数据由多个命名部分组成,形状不规则。
- 一个命名部分中的所有项目具有相同的数据类型,不同的部分可能具有不同的数据类型。
- 某种延迟加载需要成为可能,将数据位作为笨拙的 1 数组处理,而不是整个数据。
- 理想情况下,部件的名称与每个部件的数据明确关联。字典结构对此很有用,但其他东西也可以。
- 理想情况下,整个数据集从一个文件保存和加载而不会降低速度。
- 理想情况下,加载数组时它具有正确的类型,因此在示例中狗是
float
数组,猫是 int
数组。
我看了一下 awkward1.to_parquet
,虽然它看起来不错,但似乎只是为了保存一个数组。这不太适合保存多种数据类型的需要,而且我不确定如何记录列名。
我想我可以转换回笨拙的 v0 并以这种方式保存,但我不确定这将如何处理延迟加载。可能我需要写一个包装器来做这些事情,这完全没问题,但我想先检查一下是否有我应该知道的内置内容。
编辑;给出的答案效果很好。为了完整起见,我想留下一个使用它的例子;
In [1]: import awkward1 as ak
In [2]: dog = ak.from_iter([[1., 2.], [5.]])
...: cat = ak.from_iter([[4], [3]])
In [3]: ak.zip?
In [4]: pets = ak.zip({"dog": dog, "cat": cat}, depth_limit=1)
In [5]: pets.dog
Out[5]: <Array [[1, 2], [5]] type='2 * var * float64'>
In [6]: pets.cat
Out[6]: <Array [[4], [3]] type='2 * var * int64'>
In [7]: ak.to_parquet(pets, "pets.parquet")
Awkward v0 对 awkward0.save
的处理完全等同于酸洗(在 v0 或 v1 中),因此特殊名称“save”已被删除。 (它的灵感来自 NumPy 的“保存”和“加载”,但最终我们只是让 Awkward 的 __setstate__
和 __getstate__
做同样的事情。)
但是 picking/old-style 保存不会延迟加载。 (编辑:实际上,我忘记了旧式 save 确实 延迟加载,但仅在最顶层的粒度上——dict 中分开的数组在 dict 中变成了单独的“文件” ZIP 文件。Parquet 延迟加载嵌套记录的子字段。)
你说得对 ak.to_parquet
/ak.from_parquet
是延迟加载的好选择,而且这种文件格式比我们的选择格式具有更好的压缩读取速度。它也是许多程序认可的标准。 (如果你使用它,我建议通过 use_dictionary=False
和 use_byte_stream_split=True
来获取浮点数据;this page 上的所有选项都可以作为 **options
提供给 ak.to_parquet
.我需要添加一些文档来解释这些是浮点的好选择。)
ak.to_parquet
也只接受一个数组参数。但这很好:制作一个数组,而不是字典。 Awkward Array 操作数据结构这一事实可以帮助您。您可以 ak.zip 将所有数组合并到一个数组中,使用与字典键相同的字段名称。如果它们有不同的内部结构,你可以阻止它试图在所有层次上用 depth_limit=1
对齐它们,如果它们甚至有不同的长度,你可以在长度为 1 的外部结构中与 [=26] 相遇=]
has_one_more_dimension = original_array[np.newaxis]
ak.to_parquet 用于列名的名称来自 Awkward Array 本身的记录。记录中的不同字段可以有不同的数据类型。因此,您用 压缩它们的名称是 Parquet 文件的列名称,并且就绪列可以具有不同的类型。
Parquet 文件按列(包括嵌套记录的字段)和按行组延迟加载。如果要配置读取行组的粒度,将文件写入分区数组(ak.partitioned or ak.repartition)。
所以回到尴尬的 v0 是可以做到的;
import awkward
dog = awkward.fromiter([[1., 2.], [5.]])
cat = awkward.fromiter([[4], [3]])
dict_of_arrays = {'dog': dog, 'cat': cat}
awkward.save("pets.awkd", dict_of_arrays)
然后我们可以延迟加载数组
reloaded_data = awkward.load("pets.awkd")
# no data in ram
double_dog = reloaded_data["dog"]*2
# dog is in ram but not cat
简而言之,有一个由 'dog' 和 'cat' 部分组成的数据集。 整个数据集保存到磁盘上的一个文件中。 即使我没有任何文档,也很明显什么数据是狗什么是猫。 Dog 和 cat 作为笨拙的数组加载。 我可以加载数据并只使用一部分,而另一部分不会进入 ram。
我正在寻找在尴尬的 v1 中执行此操作的最佳方法。 我想满足的要求是;
- 数据由多个命名部分组成,形状不规则。
- 一个命名部分中的所有项目具有相同的数据类型,不同的部分可能具有不同的数据类型。
- 某种延迟加载需要成为可能,将数据位作为笨拙的 1 数组处理,而不是整个数据。
- 理想情况下,部件的名称与每个部件的数据明确关联。字典结构对此很有用,但其他东西也可以。
- 理想情况下,整个数据集从一个文件保存和加载而不会降低速度。
- 理想情况下,加载数组时它具有正确的类型,因此在示例中狗是
float
数组,猫是int
数组。
我看了一下 awkward1.to_parquet
,虽然它看起来不错,但似乎只是为了保存一个数组。这不太适合保存多种数据类型的需要,而且我不确定如何记录列名。
我想我可以转换回笨拙的 v0 并以这种方式保存,但我不确定这将如何处理延迟加载。可能我需要写一个包装器来做这些事情,这完全没问题,但我想先检查一下是否有我应该知道的内置内容。
编辑;给出的答案效果很好。为了完整起见,我想留下一个使用它的例子;
In [1]: import awkward1 as ak
In [2]: dog = ak.from_iter([[1., 2.], [5.]])
...: cat = ak.from_iter([[4], [3]])
In [3]: ak.zip?
In [4]: pets = ak.zip({"dog": dog, "cat": cat}, depth_limit=1)
In [5]: pets.dog
Out[5]: <Array [[1, 2], [5]] type='2 * var * float64'>
In [6]: pets.cat
Out[6]: <Array [[4], [3]] type='2 * var * int64'>
In [7]: ak.to_parquet(pets, "pets.parquet")
Awkward v0 对 awkward0.save
的处理完全等同于酸洗(在 v0 或 v1 中),因此特殊名称“save”已被删除。 (它的灵感来自 NumPy 的“保存”和“加载”,但最终我们只是让 Awkward 的 __setstate__
和 __getstate__
做同样的事情。)
但是 picking/old-style 保存不会延迟加载。 (编辑:实际上,我忘记了旧式 save 确实 延迟加载,但仅在最顶层的粒度上——dict 中分开的数组在 dict 中变成了单独的“文件” ZIP 文件。Parquet 延迟加载嵌套记录的子字段。)
你说得对 ak.to_parquet
/ak.from_parquet
是延迟加载的好选择,而且这种文件格式比我们的选择格式具有更好的压缩读取速度。它也是许多程序认可的标准。 (如果你使用它,我建议通过 use_dictionary=False
和 use_byte_stream_split=True
来获取浮点数据;this page 上的所有选项都可以作为 **options
提供给 ak.to_parquet
.我需要添加一些文档来解释这些是浮点的好选择。)
ak.to_parquet
也只接受一个数组参数。但这很好:制作一个数组,而不是字典。 Awkward Array 操作数据结构这一事实可以帮助您。您可以 ak.zip 将所有数组合并到一个数组中,使用与字典键相同的字段名称。如果它们有不同的内部结构,你可以阻止它试图在所有层次上用 depth_limit=1
对齐它们,如果它们甚至有不同的长度,你可以在长度为 1 的外部结构中与 [=26] 相遇=]
has_one_more_dimension = original_array[np.newaxis]
ak.to_parquet 用于列名的名称来自 Awkward Array 本身的记录。记录中的不同字段可以有不同的数据类型。因此,您用 压缩它们的名称是 Parquet 文件的列名称,并且就绪列可以具有不同的类型。
Parquet 文件按列(包括嵌套记录的字段)和按行组延迟加载。如果要配置读取行组的粒度,将文件写入分区数组(ak.partitioned or ak.repartition)。