如何找到最高价值的赢家全部

时间:2015-07-23 11:59:31

标签: python algorithm sorting

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

我有一个具有不同值的数组:[0, 8, 0.3, 0.2, ...]

我希望具有最高值的k元素设置为1其他元素设置为0

对于k=0.3,如果有100个值,则在结束时30(具有最高值)为1,所有其他值均为0

4 个答案:

答案 0 :(得分:2)

l成为原始列表("数组")

对于k==1/len(l)(只有一个最大数字),这很容易。

关键的实现是该算法可以分为三个部分:

  • 找到最大元素
  • 创建一个新列表,其中所有元素都设置为0
  • 将正确的元素设置为1(在新列表中)

这些步骤非常容易单独执行。如果您需要任何帮助,请随时提出其他问题(请务必先检查是否有人提出过问题)。

为任意k编写高效算法更为复杂,但我假设您重视简单性而非性能(因为您在python中编写此内容)

  • jlen(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]

答案 1 :(得分:0)

>>> 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]

答案 2 :(得分:0)

这个怎么样:

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) ]

输出:

[0, 0, 1, 0, 1, 0, 1, 0, 0, 0]

为便于比较,重复输入:

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

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

答案 3 :(得分:0)

这是在深度学习框架中实现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]])