如何在python中轻松实现K-winner take all?
我有一个具有不同值的数组:[0, 8, 0.3, 0.2, ...]
我希望将具有最高值的 k
元素设置为 1
,将其他元素设置为 0
对于 k=0.3
,如果有 100 个值,则最后 30 个(具有最高值)为 1,其他均为 0
最佳答案
让 l
成为原始列表(“数组”)
对于 k==1/len(l)
(只有一个最大数),这很容易。
关键实现是算法可以分解为三部分:
- 寻找最大元素
- 创建一个所有元素都设置为
0
的新列表
- 将正确的元素设置为
1
(在新列表中)
这些步骤很容易单独执行。如果您需要任何这些方面的帮助,请随时提出另一个问题(确保检查之前是否有人问过)。
为任意 k
编写一个高效算法更复杂,但我假设您更看重简单性而非性能(因为您是用 python 编写的)
- 令
j
为len(l)*k
(您想要的最大值的元素数) - 按降序排列列表
- 设
threshold
为已排序列表中第j
个元素的值。这是您要设置为1
的最小元素的索引。 - 创建一个所有元素都设置为 0 的新列表
- 将所有元素
>= threshold
设置为 1(在新列表中)
一个稍微复杂但 pythonic 的实现:
#-----input
l=[1,6,2,5,3,4]
k=0.5
#---------
j= int(len(l)*k)
threshold= sorted(l)[j]
result= [int(x>=threshold) for x in l]
输出:[0, 1, 0, 1, 0, 1]
关于python - 如何找到赢家通吃的最高值(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31586729/