Python numpy阵列上的广播交点

Python numpy阵列上的广播交点,python,arrays,numpy,intersection,Python,Arrays,Numpy,Intersection,我试图生成一个大的2D numpy NxN数组larr,其中每个单元格都包含字符串元素列表a或b之间的交集c。控制器名称既属于行company I表示的单元,也属于列company j表示的单元。列表a和b取自另一个数组marray,其中公司由“nfirm”列中1到N之间的整数标识。我对矩阵的对角线不感兴趣 我提出了下面的嵌套循环,但它非常慢,而且占用内存。我想知道是否有可能通过广播工会的运作以更有效的方式做到这一点。非常感谢您提供的任何改进建议。谢谢 larr = np.empty(shape

我试图生成一个大的2D numpy NxN数组larr,其中每个单元格都包含字符串元素列表a或b之间的交集c。控制器名称既属于行company I表示的单元,也属于列company j表示的单元。列表a和b取自另一个数组marray,其中公司由“nfirm”列中1到N之间的整数标识。我对矩阵的对角线不感兴趣

我提出了下面的嵌套循环,但它非常慢,而且占用内存。我想知道是否有可能通过广播工会的运作以更有效的方式做到这一点。非常感谢您提供的任何改进建议。谢谢

larr = np.empty(shape=(N,N), dtype=object)
for i in range(1,N):
   for j in range(1,N):
       a= marray['listdir'][marray['nfirm']==i].tolist()
       b= marray['listdir'][marray['nfirm']==j].tolist()
       c=np.intersect1d(a,b)
       if (len(c)>0 and (i!=j)):
           larr[i,j]=c
       else:
           larr[i,j]='NaN'
       del a, b, c
轻微改进:a重新计算j次,但与j无关:


如果我理解正确

marray['listdir']是代表导演的字符串列表,按电影索引

marray['nfirm']是代表公司的整数列表,也按电影索引

您希望创建一个由多对公司共享的董事组成的矩阵

为了提高效率,您可以先建立一个将公司与电影联系起来的字典,然后建立矩阵:

firm_movies = [[] for _ in xrange(N)]
for i, m in enumerate(marray['nfirm']):
    firm_movies[m].append(i)

larr = np.empty(shape=(N, N), dtype=object)
for i in xrange(N):
    larr[i, i] = 'NaN'
    for j in xrange(i+1, N):
       a = marray['listdir'][firm_movies[i]]
       b = marray['listdir'][firm_movies[j]]
       c = np.intersect1d(a,b)
       larr[i, j] = larr[j, i] = c if len(c)>0 else 'NaN'

看看是否有帮助。谢谢Divakar,重新编制索引的部分提高了速度抱歉,Peter,我应该说明我是在看公司的高管,即董事,而不是电影导演。因此,marray['listdir']的董事名单由公司编制索引,公司索引位于marray['nfirm']
firm_movies = [[] for _ in xrange(N)]
for i, m in enumerate(marray['nfirm']):
    firm_movies[m].append(i)

larr = np.empty(shape=(N, N), dtype=object)
for i in xrange(N):
    larr[i, i] = 'NaN'
    for j in xrange(i+1, N):
       a = marray['listdir'][firm_movies[i]]
       b = marray['listdir'][firm_movies[j]]
       c = np.intersect1d(a,b)
       larr[i, j] = larr[j, i] = c if len(c)>0 else 'NaN'