python中的反向排序和argsort

Posted

技术标签:

【中文标题】python中的反向排序和argsort【英文标题】:Reverse sort and argsort in python 【发布时间】:2012-01-16 17:39:15 【问题描述】:

我正在尝试用 Python 编写一个函数(仍然是一个菜鸟!),它返回按 tfidf 分数的内积排序的文档的索引和分数。程序是:

计算 doc idx 与所有其他文档之间的内积向量 降序排列 将“分数”和索引从第二个返回到末尾(即不是自身)

我现在的代码是:

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)

其中tfidfsparse matrix of type '<type 'numpy.float64'>'

这似乎效率低下,因为排序执行了两次(sort() 然后argsort()),然后必须反转结果。

这可以更有效地完成吗? 是否可以在不使用toarray() 转换稀疏矩阵的情况下做到这一点?

【问题讨论】:

【参考方案1】:

我认为没有必要跳过toarrayv 数组将只有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的主要内容,如果未能解决你的问题,请参考以下文章

撤消或反向 argsort(),python

使用C中的快速排序反向排序(降序)?

在python中以某列为分组对象还能对某列进行依次排序吗

python学习之列表

python 列表

Python:反向列表顺序[重复]