Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Dask包中洗牌元素_Python_Dask - Fatal编程技术网

Python 如何在Dask包中洗牌元素

Python 如何在Dask包中洗牌元素,python,dask,Python,Dask,我有一个数据集,其中几个元素彼此接近,通常在同一个分区中结束,因为它们具有二次复杂性,所以比其他元素导致更多的计算。我想随机地重新排列它们,这样工作负载就可以或多或少地平均分布在各个分区上,并且避免在单个分区中进行所有计算 现在,我正在下载coordinator中的所有内容,其中包含一段代码,如下所示: import dask.bag as db import random bag = ... l = bag.compute() random.shuffle(l) bag = db.from_

我有一个数据集,其中几个元素彼此接近,通常在同一个分区中结束,因为它们具有二次复杂性,所以比其他元素导致更多的计算。我想随机地重新排列它们,这样工作负载就可以或多或少地平均分布在各个分区上,并且避免在单个分区中进行所有计算

现在,我正在下载coordinator中的所有内容,其中包含一段代码,如下所示:

import dask.bag as db
import random

bag = ...
l = bag.compute()
random.shuffle(l)
bag = db.from_sequence(l)

有没有一种方法可以更分散地进行?例如,我尝试了基于随机键重新划分分区,但最终大多数分区都是空的。

一种解决方案是为包的每个分区洗牌。问题是,您只能为每个分区独立地洗牌

随机导入
将dask.bag作为数据库导入
将matplotlib.pyplot作为plt导入
#我们不能直接使用shuffle,因为它在原地
def随机播放(x):
“”“洗牌并返回x”“”
随机。随机(x)
返回x
bag=db。从_序列(列表(范围(2000)),npartitions=4)
#我们对每个分区应用洗牌
结果=bag.map\u分区(shuffle.compute())
打印(结果[:10],结果[-10:])
# [233, 204, 181, 18, 50, 114, 424, 6, 195, 348] [1910, 1623, 1730, 1552, 1754, 1899, 1659, 1946, 1834, 1551]
plt.散射(结果,范围(透镜(结果)))

正如您所看到的,它只是弥漫在每个分区上。但由于bag使用多处理,并且我们不在分区之间共享内存,所以这应该非常快

另一种方法是使用
dask.array
而不是
dask.bag
,即使用
shuffle\u slice
。这确实给出了更统一的结果

随机导入
将numpy作为np导入
将dask.array导入为da
从dask.array.slicing导入洗牌\u切片
将matplotlib.pyplot作为plt导入
数组=数组中的数据(np.arange(2000))
shuffle_index=np.arange(2000)
np.random.shuffle(shuffle\u索引)
数组=洗牌切分(数组,洗牌索引)
结果=数组。计算()
打印(结果[:10],结果[-10:])
plt.散射(结果,范围(透镜(结果)))


如果你能使用
dask.dataframe
也许更容易使用。

在装入包之前有没有办法洗牌?你是怎么加载数据的?以前没办法洗牌。数据来自上一个包上完成的
.map(…).flant()
。嘿,谢谢你的回答!不幸的是,第一种解决方案对我不起作用——我想在分区之间平均分配工作,而分区内洗牌不能做到这一点;此外,我不清楚如何将包含(int,int,int,object)元组的包转换为数组,也不清楚如何使用random_split。也许你能给我更多的帮助吗?我不知道怎么修理它。也许有更了解达斯克的人可以回答你