提问人:user4779 提问时间:5/30/2019 更新时间:5/30/2019 访问量:873
如何获得矢量化的 np.argmax 随机决胜局?[复制]
How to get a vectorized np.argmax random tiebreaker? [duplicate]
问:
我知道我可以通过输入 2D 数组并指定轴来矢量化 np.argmax,例如:获取每行的最大索引。np.argmax(2Darray,axis=1)
我知道如果两个条目在单个 1D 向量中相等,我希望返回最大索引,我可以通过 np.random.choice(np.flatnonzero(1Dvector == 1Dvector.max()))
问题是,我怎样才能同时做到这两点?即:如何矢量化 np.argmax,从而随机绑定相等的条目?
答:
3赞
Paul Panzer
5/30/2019
#1
这是一种方法。对于大数据,可以考虑用更便宜的东西替换它。我已经硬编码了,但这不应该掩盖原则。permutation
axis=1
def fair_argmax_2D(a):
y, x = np.where((a.T==a.max(1)).T)
aux = np.random.permutation(len(y))
xa = np.empty_like(x)
xa[aux] = x
return xa[np.maximum.reduceat(aux, np.where(np.diff(y, prepend=-1))[0])]
a = np.random.randint(0,5,(4,5))
a
# array([[2, 2, 2, 2, 1],
# [3, 3, 3, 3, 2],
# [3, 4, 2, 1, 4],
# [3, 2, 4, 2, 1]])
# draw 10000 times
res = np.array([fair_argmax_2D(a) for _ in range(10000)])
# check
np.array([np.bincount(r, None, 5) for r in res.T])
# array([[ 2447, 2567, 2449, 2537, 0],
# [ 2511, 2465, 2536, 2488, 0],
# [ 0, 5048, 0, 0, 4952],
# [ 0, 0, 10000, 0, 0]])
评论
1赞
user4779
5/30/2019
惊人的解决方案,谢谢!
评论