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

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

Numpy:填充共生矩陣的最快方法

Numpy:填充共生矩陣的最快方法

滄海一幻覺 2022-08-16 18:45:20
我有一個很長的索引元組列表(很多重復項),以及一個由n×n個索引組成的矩陣。每個元組表示一個共現項。例如:a = np.zeros(shape=(indexCount,indexCount))我試過這個:for i1,i2 in coocPairs:  #for instance (2374, 22003)    a[i1][i2}+=1  #takes way too long藝術np.put(a,coocPairs,1) #which obviously does not increment或者:np.add(a,coocPairs,1) #which takes even longer.在理想的世界中,會有一個函數獲取我的元組列表,并用它來構建一個共生矩陣,但唉(doc.不是很有幫助)。我認為解決方案可能更多地在代碼的python方面,但我的想法已經用完了。歡迎任何幫助。感謝您抽出寶貴時間接受采訪,
查看完整描述

2 回答

?
叮當貓咪

TA貢獻1776條經驗 獲得超12個贊

可以使用 a 獲取實際將出現在矩陣中的值。這之所以有效,是因為元組是可哈希的。任務變得非常簡單:collections.Counter


counts = collections.Counter(coocPairs)

ind = np.array(list(counts.keys())).T

a[ind[0], ind[1]] = list(counts.values())

通常,with 是 .在這種情況下,有必要指定軸,并記住它將是較慢的解決方案之一:np.uniquereturn_counts=TrueCounter


ind, count = np.unique(coocPairs, return_counts=True, axis=0)

a[ind.T[0], ind.T[1]] = count

相反,您可以將配對轉換為拉維矩陣中的線性索引:


ind = np.ravel_multi_index(tuple(np.array(coocPairs).T), a.shape)

現在你可以做


ind, count = np.unique(ind, return_counts=True)

a.ravel()[ind] = count

或者,您可以使用 np.bincount 更快地獲取計數,或避免預先計數。帶有raveled索引的解決方案為您節省了預先分配的麻煩:np.add.atbincounta


ind = np.ravel_multi_index(tuple(np.array(coocPairs).T), (n, n))

a = np.bincount(ind, minlength=n * n).reahape(n, n)


查看完整回答
反對 回復 2022-08-16
?
瀟瀟雨雨

TA貢獻1833條經驗 獲得超4個贊

您可以使用np.add.at

np.add.at(a,tuple(coocPairs.T),1)

如果這還不夠快,那么有更快但不太直接的解決方案。那些依賴于使用 的扁平化索引。np.bincountnp.ravel_multi_index


查看完整回答
反對 回復 2022-08-16
  • 2 回答
  • 0 關注
  • 142 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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