如何获取numpy.random.choice的索引? - 蟒蛇

Hap*_*yPy 16 python random numpy

是否可以修改numpy.random.choice函数以使其返回所选元素的索引?基本上,我想创建一个列表并随机选择元素而无需替换

import numpy as np
>>> a = [1,4,1,3,3,2,1,4]
>>> np.random.choice(a)
>>> 4
>>> a
>>> [1,4,1,3,3,2,1,4]
Run Code Online (Sandbox Code Playgroud)

a.remove(np.random.choice(a))将使用它遇到的值(a[1]在上面的示例中)删除列表的第一个元素,这可能不是所选元素(例如,a[7]).

Ósc*_*pez 10

这是找出随机选择元素的索引的一种方法:

import random # plain random module, not numpy's
random.choice(list(enumerate(a)))[0]
=> 4      # just an example, index is 4
Run Code Online (Sandbox Code Playgroud)

或者您可以在一个步骤中检索元素索引:

random.choice(list(enumerate(a)))
=> (1, 4) # just an example, index is 1 and element is 4
Run Code Online (Sandbox Code Playgroud)

  • 强烈的警告,这将有可怕的表现,这是人们首先使用numpy的主要原因之一.你正在迭代整个数组.只生成0和列表长度之间的随机整数而不是这个更便宜. (4认同)
  • 这对我不起作用。它给了我一个“ValueError:a must be 1-dimensional” (2认同)

use*_*ica 7

numpy.random.choice(a, size=however_many, replace=False)
Run Code Online (Sandbox Code Playgroud)

如果你想要一个没有替换的样品,只需要numpy让你成为一个样品.不要重复循环和绘制项目.这将产生臃肿的代码和糟糕的表现.

例:

>>> a = numpy.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> numpy.random.choice(a, size=5, replace=False)
array([7, 5, 8, 6, 2])
Run Code Online (Sandbox Code Playgroud)


CT *_*Zhu 7

关于你的第一个问题,你可以反过来,从数组的索引中随机选择a,然后获取值.

>>> a = [1,4,1,3,3,2,1,4]
>>> a = np.array(a)
>>> random.choice(arange(a.size))
6
>>> a[6]
Run Code Online (Sandbox Code Playgroud)

但是如果你只是需要随机样品而不需要更换,那就replace=False行了.不记得它何时首次加入random.choice,可能是1.7.0.因此,如果你运行很旧,numpy它可能无法正常工作.请记住默认是replace=True

  • @askwchan,对!我在想什么 `np.random.randint(0,a.size,size = size_you_want)`就足够了. (2认同)