Dask Bag of Dts to Dask array

时间:2017-11-28 23:42:19

标签: python etl dask

我需要将{'imgs': np.array(img_list), 'lables': np.array(label_list)}的dask.Bag转换为两个单独的dask.Array-s。 为什么我创建了Bag而不是直接使用Array?因为我通过map()多次处理该Bag;没有设法对Array做同样的事情。

现在,以下代码适用于小型数据集,但显然无法获得更大的数据。

images_array = da.from_array(np.array([item['images'] for item in imgs_labels_bag]), chunks=chunksize)
labels_array = da.from_array(np.array([item['labels'] for item in imgs_labels_bag]), chunks=chunksize)

如何在不将objs转换为numpy的情况下如何做到这一点?

思路:

  1. 我试过Bag - >延迟 - >数组,但由于数组形状有问题,它无法正常工作。

  2. 一个选项可能是将Bag作为文本文件转储到磁盘上,然后将其作为dask.DataFrame / Array读取。示例:b_dict.map(json.dumps).to_textfiles("/path/to/data/*.json")

  3. 我没有一袋口袋,而是每袋2袋np.array然后尝试Bag - >延迟 - >阵列

  4. 还有其他想法吗?

1 个答案:

答案 0 :(得分:0)

我建议采取以下步骤:

  1. 制作两袋numpy阵列(你必须使用map或者pluck来提取你的imageslabels值)
  2. 使用.map_partitions(np.stack).map_partitions(np.concatenate)(取决于您关注的形状)将每个分区转换为单个numpy数组
  3. 使用.to_delayed
  4. 将分区转换为dask.delayed对象
  5. 通过在每个
  6. 上调用dask.array.from_delayed将每个延迟对象转换为dask.arrays
  7. 使用da.stackda.concatenate
  8. 将这些dask数组堆叠或连接到单个dask.array中