numpy数组上的广播交集

时间:2015-11-23 08:00:39

标签: python arrays numpy intersection

我正在尝试生成一个大的2D numpy NxN数组(larr),其中每个单元格包含属于由行所代表的单元的字符串元素(导演名称)的列表(a或b)之间的交集(c)(公司i)和列(公司j)所代表的单位。列表(a和b)取自另一个数组(marray),其中公司由“nfirm”列中的1到N之间的整数标识。我对矩阵的对角线不感兴趣(我用NaN代替)。

我提出了以下嵌套循环,但它非常慢且占用内存。我想知道是否有可能通过广播联盟行动以更有效的方式做到这一点。任何提高它的提示都非常感谢。谢谢!

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

2 个答案:

答案 0 :(得分:0)

轻微改进:a重新计算j次,但与j无关:

larr = np.empty(shape=(N, N), dtype=object)
for i in range(1, N):
    a = marray['listdir'][marray['nfirm']==i].tolist()
    for j in range(1, N):
        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 b
    del a
del c

答案 1 :(得分:0)

所以如果我理解正确的话,

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'