亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

根據numpy數組中的組標簽對鄰接矩陣中的邊求和

根據numpy數組中的組標簽對鄰接矩陣中的邊求和

慕碼人2483693 2023-03-01 17:49:34
例如,我得到了對稱鄰接矩陣(無自環),即A = [[0, 1, 1, 0, 0],[1, 0, 1, 0, 1],[1, 1, 0, 1, 0],[0, 0, 1, 0, 1],[0, 1, 0, 1, 0]]然后,我得到了一組與該圖關聯的簇標簽 i,即cluster = [1,1,2,2,3]這意味著節點1和節點2在同一組,節點3和節點4在同一組,節點5在一個獨立的組。問題是我怎樣才能得到組內和組間的邊的總和,組內:指共享相同簇標簽的節點之間的邊,例如節點1和節點2在同一組中,因此它們的和為1,節點3和節點4相同。對于節點5 ,它的 0。組間:表示共享不同簇標簽的節點之間的邊,例如group 1和group 2,表示節點1節點3,節點1節點4,節點2節點3,節點2節點4的邊之和. 組1和組2之間的答案是2。然后返回一個包含結果的二維對稱數組,即[[1,2,1],[2,1,1],[1,1,0]]
查看完整描述

2 回答

?
紫衣仙女

TA貢獻1839條經驗 獲得超15個贊

您可以使用矩陣代數;


cluster = np.array(cluster)

# create cluster-node adjacency matrix

aux = np.identity(cluster.max(),int)[cluster-1]

# we can now count by multiplying

out = aux.T@A@aux

# fix diagonal (which was counted twice)

np.einsum("ii->i",out)[...] //= 2

out

# array([[1, 2, 1],

#        [2, 1, 1],

#        [1, 1, 0]])

為了加快速度,如果節點按集群排序,我們可以用 (1) 替換矩陣乘積:


boundaries = np.diff(cluster,prepend=-1).nonzero()[0]

out =  np.add.reduceat(np.add.reduceat(A,boundaries,1),boundaries,0)

(2) 如果不是:


nc = cluster.max()

out = np.zeros((nc,nc),int)

np.add.at(out,(cluster[:,None]-1,cluster-1),A)


查看完整回答
反對 回復 2023-03-01
?
眼眸繁星

TA貢獻1873條經驗 獲得超9個贊

這將返回一個數組,其元素[i,j]是相應簇的邊的總和i和j:


n = cluster.max()

degrees = np.zeros((n,n))

idx = [np.where(cluster==i)[0] for i in np.arange(n)+1]

for i in range(n):

  degrees[i,i] = A[np.ix_(idx[i],idx[i])].sum()/2

  for j in range(i):

    degrees[i,j] = degrees[j,i] = A[np.ix_(idx[i],idx[j])].sum()

輸出:


[[1. 2. 1.]

 [2. 1. 1.]

 [1. 1. 0.]]

您也可以使用 itertools,但我認為這可能更快。


查看完整回答
反對 回復 2023-03-01
  • 2 回答
  • 0 關注
  • 117 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號