猿问

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

我有一个很长的索引元组列表(很多重复项),以及一个由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方面,但我的想法已经用完了。欢迎任何帮助。感谢您抽出宝贵时间接受采访,


沧海一幻觉
浏览 113回答 2
2回答

叮当猫咪

可以使用 a 获取实际将出现在矩阵中的值。这之所以有效,是因为元组是可哈希的。任务变得非常简单:collections.Countercounts = collections.Counter(coocPairs)ind = np.array(list(counts.keys())).Ta[ind[0], ind[1]] = list(counts.values())通常,with 是 .在这种情况下,有必要指定轴,并记住它将是较慢的解决方案之一:np.uniquereturn_counts=TrueCounterind, 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.atbincountaind = np.ravel_multi_index(tuple(np.array(coocPairs).T), (n, n))a = np.bincount(ind, minlength=n * n).reahape(n, n)

潇潇雨雨

您可以使用np.add.atnp.add.at(a,tuple(coocPairs.T),1)如果这还不够快,那么有更快但不太直接的解决方案。那些依赖于使用 的扁平化索引。np.bincountnp.ravel_multi_index
随时随地看视频慕课网APP

相关分类

Python
我要回答