2015-11-23 88 views
0

我正在嘗試生成一個大的二維numpy NxN數組(larr),其中每個單元格包含屬於兩個字符串元素(導演名稱)的列表(a或b)之間的交集(c)由行(公司i)表示的單位和由列(公司j)表示的單位。列表(a和b)取自另一個陣列(marray),其中公司在'nfirm'列中用1到N之間的整數標識。我對矩陣的對角線不感興趣(我用NaN替代)。numpy陣列上的廣播交叉點

我想出了下面的嵌套循環,但它是非常緩慢和內存消耗。我想知道是否可以通過廣播工會運作來以更高效的方式來做到這一點。任何提示,以改善它非常讚賞。謝謝!

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 
+1

看看['this'](http://stackoverflow.com/questions/33698592/is-there-a-better-way-to-determine-cross-mapping-indicies-for-numpy-arrays)有幫助。 – Divakar

+0

謝謝Divakar,reindexing部分提高速度 – Bernilli

回答

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 
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' 
+0

對不起彼得,我應該指定我正在看公司的高管(即導演),而不是電影導演。因此,marray ['listdir']中的董事名單由公司索引(公司索引位於marray ['nfirm']) – Bernilli