我正在这段代码中尝试将给定元素搜索到具有随机数的数组中。随着散点图和减少,我只想计算元素在数组中存在多少次。我分散了数组,并在拆分子数组中进行搜索。每个拆分数组都会找到在此子数组中找到该元素的次数,然后使用reduce收集在整个主数组中找到该元素的所有时间。
from mpi4py import MPI
import numpy as np
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
nprocs = comm.Get_size()
N=100
b=20
if rank == 0:
a = np.random.randint(99,size=N)
print ("First: ", a)
else:
a = np.array (0 ,'i')
a=comm.bcast(a,root=0)
recvbuf= np.empty ([1,N/nprocs],'d')
comm.Scatter(a, recvbuf, root=0)
counter=0
totalCounter=0
for i in range(0,(N/nprocs)+1,1):
if(recvbuf[i]==b):
counter=counter+1
totalCounter=comm.reduce(counter,op=MPI.SUM,root=0)
if (rank == 0):
print('The element {} found:'.format(b), totalCounter)
但是它不起作用....我有以下错误:
('First: ', array([76, 45, 85, 94, 43, 24, 60, 97, 88, 66, 43, 34, 72, 65, 34, 58, 97,
70, 72, 34, 28, 51, 34, 66, 64, 31, 15, 58, 9, 31, 84, 21, 25, 33,
93, 36, 48, 62, 91, 57, 65, 13, 25, 4, 69, 34, 21, 82, 74, 59, 53,
47, 2, 32, 20, 74, 6, 98, 35, 42, 55, 94, 3, 46, 90, 47, 43, 50,
59, 28, 60, 76, 41, 71, 46, 10, 1, 77, 10, 60, 85, 98, 10, 57, 78,
93, 79, 83, 60, 71, 61, 78, 2, 83, 56, 24, 22, 1, 37, 67]))
Traceback (most recent call last):
File "search.py", line 29, in <module>
if(recvbuf[i]==b):
ValueError:具有多个元素的数组的真值不明确。使用a.any()或a.all() 追溯(最近一次通话): 在第29行的文件“ search.py”中 if(recvbuf [i] == b): ValueError:具有多个元素的数组的真值不明确。使用a.any()或a.all()
答案 0 :(得分:1)
由于recv_buf.shape
是(1,N//nprocs)
,因此触发了错误。
将其设为1-D recvbuf= np.empty ([N//nprocs], 'd')
,就可以了(注意我使用//
,所以您的程序适用于py2和py3)。
顺便说一句,您可能需要查看一下以计算发生次数: How to count the occurrence of certain item in an ndarray in Python?
此外,您还要混合使用不同的类型:进程0上的a
未键入(因此它是int64),其他进程上的a
被键入了'i'(所以它是int32,但是您不使用它,因此这是一个实际问题),而recvbuf是'f'(float32)。