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

时间:2017-01-16 02:26:45

标签: python numpy

我正在使用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 个答案:

答案 0 :(得分:5)

内置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', '<i4'), ('f1', '<f8')])

根据第二列(order='f1')使用np.sort,然后取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', '<i4'), ('f1', '<f8')])

然而partition支持不稳定的算法,所以它可能更快,但它的灵活性肯定不那么灵活。