如何在python中轻松实现K-winner?
我有一个具有不同值的数组:[0, 8, 0.3, 0.2, ...]
我希望具有最高值的k
元素设置为1
其他元素设置为0
对于k=0.3
,如果有100个值,则在结束时30(具有最高值)为1,所有其他值均为0
答案 0 :(得分:2)
让l
成为原始列表("数组")
对于k==1/len(l)
(只有一个最大数字),这很容易。
关键的实现是该算法可以分为三个部分:
0
1
(在新列表中)这些步骤非常容易单独执行。如果您需要任何帮助,请随时提出其他问题(请务必先检查是否有人提出过问题)。
为任意k
编写高效算法更为复杂,但我假设您重视简单性而非性能(因为您在python中编写此内容)
j
为len(l)*k
(您想要的最大元素数量)threshold
为排序列表中j
元素的值。这是您要设置为1
的最小元素的索引。>= 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]])