首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Numpy argmax -随机断系

Numpy argmax -随机断系
EN

Stack Overflow用户
提问于 2017-02-06 15:38:16
回答 6查看 21.7K关注 0票数 52

numpy.argmax函数中,多个max元素之间的领带断裂使得第一个元素被返回。是否有随机破坏领带的功能,使所有的最大数目都有相同的机会被选中?

下面是直接来自numpy.argmax文档的一个示例。

代码语言:javascript
复制
>>> b = np.arange(6)
>>> b[1] = 5
>>> b
array([0, 5, 2, 3, 4, 5])
>>> np.argmax(b) # Only the first occurrence is returned.
1

我正在寻找方法,以便列表中的第1和第5元素以相同的概率返回。

谢谢!

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2017-02-06 15:40:33

使用np.random.choice -

代码语言:javascript
复制
np.random.choice(np.flatnonzero(b == b.max()))

让我们来验证一个有三个最大候选的数组-

代码语言:javascript
复制
In [298]: b
Out[298]: array([0, 5, 2, 5, 4, 5])

In [299]: c=[np.random.choice(np.flatnonzero(b == b.max())) for i in range(100000)]

In [300]: np.bincount(c)
Out[300]: array([    0, 33180,     0, 33611,     0, 33209])
票数 55
EN

Stack Overflow用户

发布于 2017-03-29 20:14:59

在多维数组的情况下,choice不能工作。

另一种选择是

代码语言:javascript
复制
def randargmax(b,**kw):
  """ a random tie-breaking argmax"""
  return np.argmax(np.random.random(b.shape) * (b==b.max()), **kw)

如果由于某种原因产生随机浮点数比其他方法慢,则可以用另一种方法代替random.random

票数 14
EN

Stack Overflow用户

发布于 2019-10-10 05:03:46

最简单的方法是

代码语言:javascript
复制
np.random.choice(np.where(b == b.max())[0])
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42071597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档