numpy阵列上的广播交叉点

2024-09-28 21:58:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图生成一个大的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

Tags: in元素列表fornp公司range数组
2条回答

如果我理解正确

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'

小改进: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

相关问题 更多 >