【发布时间】:2021-03-29 09:30:36
【问题描述】:
所以回到尴尬的 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 加载为尴尬的数组。 我可以加载数据并只使用其中一个部分,而另一部分不会在 ram 中结束。
我正在寻找在尴尬的 v1 中执行此操作的最佳方法。 我想满足的要求是;
- 数据由多个命名部分组成,形状不规则。
- 一个命名部分中的所有项目都具有相同的数据类型,不同的部分可能具有不同的数据类型。
- 某种延迟加载需要成为可能,将数据位作为笨拙的1 数组处理,而不需要全部内容。
- 理想情况下,部件的名称明确地与每个部件的数据相关联。字典结构对此很有用,但其他方法也可以。
- 理想情况下,从一个文件保存和加载整个数据集不会影响速度。
- 理想情况下,加载数组时它具有正确的类型,因此在示例中 dog 是
float数组,而 cat 是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-array