Python - 从 array/converting numpy 数组中获取最频繁的元素到 std 数组
Python - taking most frequent element from array/converting numpy array to std array
我正在 Python 中实现 K 最近邻算法(对于那些不知道学习的人来说,这是一种用于根据数据对对象进行分类的算法已经分类,使用欧氏距离)。
我已经计算出我的距离,我可以取 k 个最近的距离,并找到这些对象的 类。我的问题是,如果 K 大于 1,比如 3 或 5,我不确定如何获得列表中出现频率最高的元素。
比如我的输出是:
[10, 9, 7, 10]
10 出现次数最多,所以我想 return 这个数字。如果出现平局(2 个或更多元素出现相同的频率),它 return 是一个错误(我可以自己处理)。我只是想就如何 return 上面列表中的最大值提出一些意见。 (使用 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)]
我能做些什么来简单地 return [10, 7, 10, 9]
?
感谢您的帮助。
问题 2 比较简单(不过以后请 post 不相关的问题作为两个单独的问题放在 SO 上)。 tolist
函数自动将 numpy 数组转换为常规列表 http://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.tolist.html
问题 1 也很简单。你说你想要"the most frequent element in the list"。这是一个完整的讨论 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())]
跟进 en_Knight 的好回答中给出的评论(支持对现有线程的引用,但要注意字典理解在 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.
下测试
我正在 Python 中实现 K 最近邻算法(对于那些不知道学习的人来说,这是一种用于根据数据对对象进行分类的算法已经分类,使用欧氏距离)。
我已经计算出我的距离,我可以取 k 个最近的距离,并找到这些对象的 类。我的问题是,如果 K 大于 1,比如 3 或 5,我不确定如何获得列表中出现频率最高的元素。
比如我的输出是:
[10, 9, 7, 10]
10 出现次数最多,所以我想 return 这个数字。如果出现平局(2 个或更多元素出现相同的频率),它 return 是一个错误(我可以自己处理)。我只是想就如何 return 上面列表中的最大值提出一些意见。 (使用 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)]
我能做些什么来简单地 return [10, 7, 10, 9]
?
感谢您的帮助。
问题 2 比较简单(不过以后请 post 不相关的问题作为两个单独的问题放在 SO 上)。 tolist
函数自动将 numpy 数组转换为常规列表 http://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.tolist.html
问题 1 也很简单。你说你想要"the most frequent element in the list"。这是一个完整的讨论 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())]
跟进 en_Knight 的好回答中给出的评论(支持对现有线程的引用,但要注意字典理解在 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.
下测试