Python 将具有特定大小的数组发送给工作人员

Python 将具有特定大小的数组发送给工作人员,python,arrays,numpy,mpi,Python,Arrays,Numpy,Mpi,我想发送一个大小为336的数组,分成几个部分发送给我的8名工作人员。我希望0-8号工人的尺码是12、18、30、36、48、54、66和72号。所以加上6,然后加上12和6,依此类推。。。在这一点上,我能够将阵列切成10块 这就是我想到的: from mpi4py import MPI comm = MPI.COMM_WORLD rank = comm.Get_rank() size = comm.Get_size() v=np.random.rand(100,1) #array if

我想发送一个大小为336的数组,分成几个部分发送给我的8名工作人员。我希望0-8号工人的尺码是12、18、30、36、48、54、66和72号。所以加上6,然后加上12和6,依此类推。。。在这一点上,我能够将阵列切成10块

这就是我想到的:

from mpi4py import MPI

comm = MPI.COMM_WORLD
rank = comm.Get_rank()
size = comm.Get_size()

v=np.random.rand(100,1) #array



if rank == 0:

    # Process to send data to the different processes. Just send evenly chunks to the processes.
    for i in range(1, size):

        v_splitted=[np.array_split(v, 10)[i-1]]
        comm.send(v_splitted, dest=i, tag=i)

# worker processes
else:

    # each worker process receives data from master process
    data = comm.recv(source=0, tag=rank)

如何确保每个工人都获得所需的大小?

您可以使用“从itertools和zip累积”来构建切片列表。然后使用它将数组分解为所需大小的块:

from itertools import accumulate
sizes  = [12,18,30,36,48,54,66,72]    # or [*accumulate([12,6]*4)]
breaks = [*accumulate(sizes)]
slices = [slice(s,e) for s,e in zip([0]+breaks,breaks)]

v = list(range(336))
for i,chunk in enumerate(slices):
    print(len(v[chunk]),":",*v[chunk][:3],"...",*v[chunk][-3:])
    # comm.send(v[chunk], dest=i, tag=i)
输出:

12 : 0 1 2 ... 9 10 11
18 : 12 13 14 ... 27 28 29
30 : 30 31 32 ... 57 58 59
36 : 60 61 62 ... 93 94 95
48 : 96 97 98 ... 141 142 143
54 : 144 145 146 ... 195 196 197
66 : 198 199 200 ... 261 262 263
72 : 264 265 266 ... 333 334 335
它的工作原理

中断
列表包含在每个区块末尾处理的项目的累积数量:

[12, 30, 60, 96, 144, 198, 264, 336]
这些数字对应于表示每个数据块的索引范围的末尾。要获得这些范围的起始值,我们只需将每个结束值与前一个块的结束值(第一个块从零开始)配对:


这是
slices
变量将包含的内容,只是为了便于以后使用,它返回slice()对象列表,而不是range()对象列表。切片对象可以直接用作包含数据的列表或数组的下标(例如
v[slice]
)。这里使用zip()函数来创建结束值对,其中前一个结束(即开始)是通过用一个额外的条目(零)抵消中断来获得的。

您需要什么帮助?拆分数组
v
,或向每个工作人员发送其工作负载?谢谢Alain,有一个问题tho,slices=[slice(s,e)for s,e in zip([0]+breaks,breaks)]这一行做什么?
starts (s):   [0] [12, 30, 60,  96, 144, 198, 264, 336]
ends (e):     [12, 30, 60, 96, 144, 198, 264, 336]

ranges:       (0,12), (12,30), (30,60) ... (264,336)