python中的反向排序和argsort
Posted
技术标签:
【中文标题】python中的反向排序和argsort【英文标题】:Reverse sort and argsort in python 【发布时间】:2012-01-16 17:39:15 【问题描述】:我正在尝试用 Python 编写一个函数(仍然是一个菜鸟!),它返回按 tfidf 分数的内积排序的文档的索引和分数。程序是:
计算 docidx
与所有其他文档之间的内积向量
降序排列
将“分数”和索引从第二个返回到末尾(即不是自身)
我现在的代码是:
import h5py
import numpy as np
def get_related(tfidf, idx) :
''' return the top documents '''
# calculate inner product
v = np.inner(tfidf, tfidf[idx].transpose())
# sort
vs = np.sort(v.toarray(), axis=0)[::-1]
scores = vs[1:,]
# sort indices
vi = np.argsort(v.toarray(), axis=0)[::-1]
idxs = vi[1:,]
return (scores, idxs)
其中tfidf
是sparse matrix of type '<type 'numpy.float64'>'
。
这似乎效率低下,因为排序执行了两次(sort()
然后argsort()
),然后必须反转结果。
toarray()
转换稀疏矩阵的情况下做到这一点?
【问题讨论】:
【参考方案1】:我认为没有必要跳过toarray
。 v
数组将只有n_docs
长,在实际情况下与n_docs
× n_terms
tf-idf 矩阵的大小相形见绌。此外,它会非常密集,因为两个文档共享的任何术语都会使它们具有非零相似性。稀疏矩阵表示只有在您存储的矩阵 非常 稀疏时才会得到回报(我已经看到 Matlab 的 >80% 的数据并假设 Scipy 会相似,尽管我没有确切的图)。
双重排序可以通过做跳过
v = v.toarray()
vi = np.argsort(v, axis=0)[::-1]
vs = v[vi]
顺便说一句,您在稀疏矩阵上使用np.inner
不适用于最新版本的 NumPy;获取两个稀疏矩阵的内积的安全方法是
v = (tfidf * tfidf[idx, :]).transpose()
【讨论】:
感谢您的快速回复。只是想知道,你知道toarray()
函数是如何工作的吗?我认为它不会复制数据
@tdc:它确实会复制。它会填充零位。
@tdc:我刚刚意识到还有一个更重要的优化需要进行:您应该使用 CSR 稀疏矩阵。在任何其他表示中,内积计算都是次优的。
1) 我可以在不复制的情况下进行排序等操作吗? 2) 从 csc 到 csr 的翻译有多贵?
1) 我不知道。 2) 非常便宜。我相信这只是重新排列一些索引的问题,而无需实际复制数据。以上是关于python中的反向排序和argsort的主要内容,如果未能解决你的问题,请参考以下文章