为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 109 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信