【问题标题】:Python - taking most frequent element from array/converting numpy array to std arrayPython - 从数组中获取最频繁的元素/将numpy数组转换为std数组
【发布时间】:2015-05-23 07:38:09
【问题描述】:

我正在用 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]

感谢您的帮助。

【问题讨论】:

    标签: python list max frequency python-2.6


    【解决方案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())]
    

    【讨论】:

    • 嗨。很抱歉,它说要等待 90 分钟才能再次发布。发布几分钟后,我设法得到了问题 2。问题1 我还是不确定,我想返回一个数组中最大的数,如果有相同频率的数,返回一个数组中的多个数。
    • @Tazman 你说的是两件不同的事情。数字的“频率”是它在数组中出现的次数。最大的数字是具有最大价值的数字。我发布的代码和我链接的讨论涉及频率;最高数字只是“最大”功能。例如,在列表[1,1,2]中,频率最高的数字是1,最高的数字是2
    • 抱歉,来晚了,我已经写了一整天了。我希望函数从数组列表中返回,即在数组中出现最多的数字。如果出现平局,则返回数组中的两个(或多个)数字。例如。 [10,9,10,3,2] = [10],并且 [10,9,9,10,2,1] = [10, 9]
    • 我提供的代码和我提供的链接正是这样做的。
    【解决方案2】:

    跟进 en_Knight 的好答案中给出的 cmets(赞成引用现有线程,但要注意 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下测试。

    【讨论】:

    • 这正是我所需要的,非常感谢!
    • @Tazman,很高兴能帮上忙。如果您整天都在编码,请不要忘记休息一下。 ;-)
    • 是的,我只是太得意忘形了,在解决问题之前什么也做不了。我就是这样的人,可能不健康。再次感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 2021-12-18
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多