Python - 从数组/转换numpy数组到std数组中最频繁的元素

时间:2015-03-20 00:18:32

标签: python list max frequency python-2.6

我正在使用Python实现K最近邻算法(对于那些不了解学习的人来说,它是一种用于根据数据对对象进行分类的算法已经分类,使用欧几里德距离)。

我计算了距离,我可以取k个最近距离,找到这些物体的类别。我的问题是,如果K大于1,比如3或5,我不确定如何获得列表中最常用的元素。

例如,我的输出是:

[10, 9, 7, 10]

10发生最多,所以我想返回这个号码。如果出现平局(2个或更多元素出现相同频率),则返回错误(我自己可以处理)。我想就如何返回上述列表的最大值发表意见。 (使用python 2.6.6 ,因此我无法使用集合导入。)

第二个问题:

我试图将numpy数组转换为普通数组。我的代码如下所示:

def getClassesOfIndexes(l):
    tmp1 = []
    for i in l:
        tmp1.append(classes[i])
    return tmp1

print(getClassesOfIndexes([1024, 9128, 394, 39]))

这会打印出类似:[array([10], dtype=uint8), array([7], dtype=uint8), array([10], dtype=uint8), array([9], dtype=uint8)]

的内容

我可以做些什么来简单地返回[10, 7, 10, 9]

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

问题2 更容易(尽管将来,请将不相关的问题作为两个单独的问题发布在SO上)。 tolist函数会自动将numpy数组转换为常规列表http://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.tolist.html

问题1 也非常简单。你说你想要“列表中最常见的元素”。这是一个完整的讨论Python most common element in a list。一种解决方案是将每个元素映射到其频率的字典,然后获取与映射中的最大值对应的键。这可能看起来像

...
freq_map = {my_list.count(val):val for val in set(my_list)}
return freq_map[max(freq_map.keys())]

答案 1 :(得分:0)

对en_Knight的好答案给出的评论进行了跟进(对现有线程的引用进行了评价,但要注意dict理解在Python2.6.6下不起作用!):如果你想要一个列表最常见的元素(那些频率相同的元素),您可以执行以下操作:

>>> arr = [10,9,9,7,10]
>>> counter = {}
>>> for elm in arr:
...     try:
...         counter[elm] += 1
...     except KeyError:
...         counter[elm] = 1
... 
>>> counter
{9: 2, 10: 2, 7: 1}
>>> srt = sorted(counter.items(), key=lambda x: x[1], reverse=True)
>>> maxitem, maxcount = srt[0]
>>> most_frequents = [maxitem]
>>> for rec in srt[1:]:
...     if rec[1] == maxcount:
...         most_frequents.append(rec[0])
...     else:
...         break
... 
>>> most_frequents
[9, 10]

在Python2.6.6下测试。