首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Dask到Dask阵列的Dask袋

从Dask到Dask阵列的Dask袋
EN

Stack Overflow用户
提问于 2017-11-28 23:42:19
回答 2查看 1.4K关注 0票数 3

我需要将dask.Bag of {'imgs': np.array(img_list), 'lables': np.array(label_list)}转换成两个独立的dask.Array-s。为什么我创建了袋子而不是直接去数组?因为我正在通过map()多次处理这个包,所以没有对Array做同样的处理。

现在,下面的代码适用于小型数据集,但显然不能用于更大的数据。

代码语言:javascript
复制
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. 我尝试过包->延迟->阵列,但它没有工作,因为数组形状的问题。
  2. 一个选项可能是将包作为文本文件转储到磁盘上,然后将其作为dask.DataFrame/Array读取。示例:b_dict.map(json.dumps).to_textfiles("/path/to/data/*.json")
  3. 与其有一袋dicts,我可以每个有2袋np.array,然后尝试each ->延迟->阵列。

还有其他想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-29 04:50:10

如果item['images']是一维numpy数组,并且希望以以下方式平铺它们:

代码语言:javascript
复制
+---------------+
|item0['images']|
+---------------+
|item1['images']|
+---------------+
|item2['images']|
+---------------+    

然后这个可以工作(文档):

代码语言:javascript
复制
import dask.bag as db
import numpy as np
import dask.array as da
b = db.from_sequence([{'img':np.arange(10)}]*4)
s = da.stack([item['img'] for item in b], axis=0)
print(s.compute())

结果:

代码语言:javascript
复制
[[0 1 2 3 4 5 6 7 8 9]
 [0 1 2 3 4 5 6 7 8 9]
 [0 1 2 3 4 5 6 7 8 9]
 [0 1 2 3 4 5 6 7 8 9]]
票数 1
EN

Stack Overflow用户

发布于 2017-11-29 13:28:17

我建议采取以下步骤:

  1. 制作两袋numpy数组(您必须使用映射或拔出来提取imageslabels值)
  2. 使用.map_partitions(np.stack).map_partitions(np.concatenate) (取决于您所关心的形状)将每个分区转换为单个numpy数组
  3. 使用dask.delayed将分区转换为.to_delayed对象
  4. 通过对每个延迟对象调用dask.arrays,将每个延迟对象转换为dask.array.from_delayed
  5. 使用dask.array或da.concatenate将这些dask数组叠加或连接到一个单一的da.concatenate中。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47542788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档