我正在使用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]
?
感谢您的帮助。
答案 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下测试。