Numpy搜索数组中的一个元素(分散并减少)

时间:2019-12-27 12:44:38

标签: python numpy mpi4py

我正在这段代码中尝试将给定元素搜索到具有随机数的数组中。随着散点图和减少,我只想计算元素在数组中存在多少次。我分散了数组,并在拆分子数组中进行搜索。每个拆分数组都会找到在此子数组中找到该元素的次数,然后使用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()

1 个答案:

答案 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)。