Python 如何找到赢家通吃的最高价值

Python 如何找到赢家通吃的最高价值,python,algorithm,sorting,Python,Algorithm,Sorting,如何在python中轻松实现K-winner通吃 我有一个具有不同值的数组:[0,8,0.3,0.2,…] 我希望将具有最高值的k元素设置为1其他元素设置为0 对于k=0.3,如果有100个值,则在30末尾(具有最高值)为1,所有其他值均为0让l为原始列表(“数组”) 对于k==1/len(l)(只有一个最大值),这很简单 关键实现是算法可以分解为三个部分: 求最大元素 创建一个所有元素都设置为0 将正确的元素设置为1(在新列表中) 这些步骤很容易单独执行。如果你在这些问题上需要帮助,请随意

如何在python中轻松实现K-winner通吃

我有一个具有不同值的数组:
[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
    th元素的值。这是要设置为
    1
    的最小元素的索引
  • 创建一个所有元素都设置为0的新列表
  • 将所有元素
    >=阈值
    设置为1(在新列表中)

一个稍微复杂但类似Python的实现:

#-----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]
>a=[1,2,44,5100]
>>> a = [1,2,44,5,100]
>>> new_list = []
>>> max(a)
100
>>> for values in a:
...     if values < 100:
...             values = 0
...             new_list.append(values)
...     else:
...             values = 1
...             new_list.append(values)
... 
>>> print new_list
[0, 0, 0, 0, 1]
>>>新列表=[] >>>马克斯(a) 100 >>>对于a中的值: ... 如果值小于100: ... 值=0 ... 新列表。追加(值) ... 其他: ... 值=1 ... 新列表。追加(值) ... >>>打印新列表 [0, 0, 0, 0, 1]
这个怎么样:

a=[4, 3, 9, 6, 8, 7, 10, 5, 2, 1] 
k=0.3
cutoff=int(k*len(a) )
b=zip( a, range(len(a)) )
c=zip( sorted(b,reverse=True), range(len(b)) )
d=map( lambda r: (r[0][1],1) if r[1]<cutoff else (r[0][1],0),  c )
[ i[1] for i in sorted(d) ]
为便于比较,重复输入:

[4, 3, 9, 6, 8, 7, 10, 5, 2, 1]

我本可以编写更密集的代码,但像这样,您可以检查变量a、b、c和d。

以下是在深度学习框架中实现K-winner-take-all功能的方法:

sparse_factor = 0.3
x = torch.randn([1, 10])

k = int(sparse_factor * x.shape[1])
topval = x.topk(k, dim=1)[0][:, -1]
topval = topval.expand(x.shape[1], x.shape[0]).permute(1, 0)
comp = (x >= topval).to(x)
print(comp * x)
张量([-0.0000,-0.0000,0.0000,-0.0000,1.0534,0.0000,1.1854, 0.9829, -0.0000, 0.0000]])


我建议您尝试编写一些代码。@user3012759这没有帮助。虽然这个问题对你来说容易得令人沮丧,而且问题的撰写也不是最好的,但至少这是一个不错的问题all@goncalopp,我认为这个问题不是一个坏问题,但是这个问题很糟糕。。。零努力,没有代码,只是使用SO作为代码编写服务,这是不对的?Edoardo,你可能会发现在编写问题时花更多的时间和精力会导致更好的接收(和更多的答案)。注意,这只回答了
k==1/len(a)
zip(a,range(len(a))
可能只是
enumerate(a)
,如果您交换订单。但是,一般来说,在元组中携带索引会使其变得比需要的复杂,这比它应该的复杂得多,而且它不考虑“抽取”(即截止点周围的相等值)。
sparse_factor = 0.3
x = torch.randn([1, 10])

k = int(sparse_factor * x.shape[1])
topval = x.topk(k, dim=1)[0][:, -1]
topval = topval.expand(x.shape[1], x.shape[0]).permute(1, 0)
comp = (x >= topval).to(x)
print(comp * x)