当前位置:  开发笔记 > 编程语言 > 正文

如何从下面的向量中获得具有最高值的5个元组?

如何解决《如何从下面的向量中获得具有最高值的5个元组?》经验,为你挑选了1个好方法。

我正在使用gensim进行实验.我正在使用lda模型来获得一个概率向量,如下所示:

[(0, 0.01666666666666804), (1, 0.01666666666666982), (2, 0.01666666666667857), 
 (3, 0.016666666666667104), (4, 0.016666666666668519), (5, 0.01666666666666838), 
 (6, 0.016666666666681464), (7, 0.016666666666669494), (8, 0.016666666666669269), 
 (9, 0.016666666666667069), (10, 0.016666666668398125), (11, 0.016666666666666666), 
 (12, 0.51666666666481131), (13, 0.01666666666668485), (14, 0.01666666666666948), 
 (15, 0.016666666666667097), (16, 0.016666666666666666), (17, 0.016666666666666767), 
 (18, 0.016666666666667922), (19, 0.016666666666678695), (20, 0.016666666666667683), 
 (21, 0.016666666666677307), (22, 0.016666666666669522), (23, 0.016666666666675913), 
 (24, 0.016666666666670923), (25, 0.016666666666667409), (26, 0.016666666666680405), 
 (27, 0.016666666666666666), (28, 0.0166666666666705), (29, 0.016666666666668353)]

它是由元组组成的列表,元组的第一个组成部分是主题,第二个是概率:

(topic, probability)

我想在元组列表中获得具有最高概率的5个主题,如下所示:

max = [(topicN, probability),...]

我尝试首先将这个元组转换为numpy结构,如下所示:

vector = lda[ques_vec]
print(vector)
types = numpy.dtype('int,float')
data = numpy.array(vector,dtype=types)
print(data)

但是我不知道如何命令这个结构来获得具有最高概率的五个元组的列表,所以我想感谢支持.



1> MSeifert..:

内置heapq模块包含一个nlargest功能:

from heapq import nlargest
from operator import itemgetter

>>> nlargest(5, vector, key=itemgetter(1))  # get the 5 largest values based on the second item in each tuple
[(12, 0.5166666666648113), (10, 0.016666666668398125), (13, 0.01666666666668485), (6, 0.016666666666681464), (26, 0.016666666666680405)]

或者您可以使用带切片的反向排序:

>>> sorted(vec, key=itemgetter(1), reverse=True)[:5]
[(12, 0.5166666666648113), (10, 0.016666666668398125), (13, 0.01666666666668485), (6, 0.016666666666681464), (26, 0.016666666666680405)]

但是这两种方法都不需要numpy.


它也可以使用numpy,但是我能提出的方法需要一些中间步骤:

>>> types = np.dtype('int, float')
>>> data = np.array(vector, dtype=types)
>>> np.sort(data, order='f1')[-5:][::-1]
array([(12, 0.5166666666648113), (10, 0.016666666668398125),
       (13, 0.01666666666668485), (6, 0.016666666666681464),
       (26, 0.016666666666680405)], 
      dtype=[('f0', '

这使用np.sort基于第二列(order='f1'),然后获取最后5个项目(numpy仅支持从低到高的排序)[-5:]并最终反转剩余的项目([::-1]).

需要注意的是np.sort:默认情况下,它使用非稳定的排序算法(Quicksort).因此,如果您希望具有相同概率的多个值,则可能需要稳定排序,那么您应该指定kind='mergesort'.

还有另一种使用numpy的方法,它不需要完整的排序np.partition:

>>> types = np.dtype('int, float')
>>> data = np.array(vector, dtype=types)
>>> np.partition(data, -5, order='f1')[-5:][::-1]
array([(12, 0.5166666666648113), (10, 0.016666666668398125),
       (13, 0.01666666666668485), (6, 0.016666666666681464),
       (26, 0.016666666666680405)], 
      dtype=[('f0', '

然而,partition支持没有稳定的算法,所以它可能更快,但它绝对不那么灵活.

推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有