我正在尝试生成一个大的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
答案 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'