python中的反向排序和argsort

python中的反向排序和argsort,python,numpy,scipy,information-retrieval,sparse-matrix,Python,Numpy,Scipy,Information Retrieval,Sparse Matrix,我正在尝试用Python编写一个函数(仍然是noob!),它返回按tfidf分数内积排序的文档的索引和分数。程序如下: 计算docidx和所有其他文档之间的内积向量 按降序排序 返回从第二个到最后的“分数”和指数(即不是其本身) 我目前掌握的代码是: import h5py import numpy as np def get_related(tfidf, idx) : ''' return the top documents ''' # calculate inner

我正在尝试用Python编写一个函数(仍然是noob!),它返回按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)
其中
tfidf
是类型为“的
稀疏矩阵

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

  • 这样做能更有效吗
  • 不使用
    toarray()
    转换稀疏矩阵就可以做到这一点吗

我认为没有任何真正的必要跳过
的安排。
v
数组的长度仅为
n_文档
长,与实际情况下的
n_文档
×
n_项
tf idf矩阵的大小相比相形见绌。而且,它将非常密集,因为两个文档共享的任何术语都会使它们具有非零相似性。稀疏矩阵表示只有在您存储的矩阵非常稀疏时才有回报(我已经看到了>80%的Matlab图形,并假设Scipy将是类似的,尽管我没有确切的数字)

可以通过执行以下操作跳过双重排序

v = v.toarray()
vi = np.argsort(v, axis=0)[::-1]
vs = v[vi]
顺便说一句,你在稀疏矩阵上使用的
np.internal
在最新版本的NumPy上不起作用;求两个稀疏矩阵的内积的安全方法是

v = (tfidf * tfidf[idx, :]).transpose()

谢谢你的迅速回复。只是想知道,您知道
toarray()
函数是如何工作的吗?我认为它不会复制data@tdc例如它确实复制了一份。它填充了零位置。@tdc:我刚刚意识到还有一个更重要的优化需要进行:您应该使用CSR稀疏矩阵。在任何其他表示法中,内积计算都是次优的。1)我可以在不复制的情况下进行排序吗?2) 从csc到csr的翻译有多贵?1)我不知道。2) 非常便宜。我相信这只是重新安排一些索引的问题,而不是数据被实际复制。