numpy搜索数组中的一个元素(分散并归约)

问题描述 投票:0回答:1

我正在这段代码中尝试将给定元素搜索到具有随机数的数组中。随着散点图和减少,我只想计算元素在数组中存在多少次。我分散了数组,并在拆分子数组中进行搜索。每个拆分数组都会找到在此子数组中找到该元素的次数,然后使用reduce收集在整个主数组中找到该元素的所有时间。

从mpi4py导入MPI

将numpy导入为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()

python numpy mpi4py
1个回答
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?

© www.soinside.com 2019 - 2024. All rights reserved.