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

时间:2013-09-13 20:05:56

标签: 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]

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

8 个答案:

答案 0 :(得分:9)

以下是查找随机选择元素的索引的一种方法:

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

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

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

答案 1 :(得分:7)

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

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

但如果您只是需要随机样本而无需替换,replace=False就可以了。不记得它何时首次添加到random.choice,可能是1.7.0。因此,如果您运行的是非常旧的numpy,它可能无效。请注意,默认值为replace=True

答案 2 :(得分:6)

numpy.random.choice(a, size=however_many, replace=False)

如果你想要一个没有替换的样品,只需要让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])

答案 3 :(得分:4)

与其他答案相比,这在左侧领域有点偏,但我认为这听起来有点像你试图在更大的意义上做的事情。您可以通过改组源数组中元素的索引来生成随机样本而无需替换:

source = np.random.randint(0, 100, size=100) # generate a set to sample from
idx = np.arange(len(source))
np.random.shuffle(idx)
subsample = source[idx[:10]]

这将通过从源集(此处,大小为100)中绘制元素而无需替换来创建样本(此处的大小为10)。

您可以使用剩余的索引值(即:

)与未选择的元素进行交互
notsampled = source[idx[10:]]

答案 4 :(得分:0)

根据您的评论:

  

样本已经a。我希望直接使用a,这样我就可以控制剩余的元素数量,并使用a执行其他操作。 - HappyPy

对我而言,在删除a随机选择的元素后,您感兴趣的是n。相反,为什么不使用来自N = len(a) - n的{​​{1}}个随机选择的元素?既然你希望它们仍然保持原始顺序,你可以从@ CTZhu的答案中选择索引,但是然后对它们进行排序并从原始列表中获取:

a

现在您可以再次将其保存为import numpy as np n = 3 #number to 'remove' a = np.array([1,4,1,3,3,2,1,4]) i = np.random.choice(np.arange(a.size), a.size-n, replace=False) i.sort() a[i] #array([1, 4, 1, 3, 1])

a

并与a = a[i] 合作,删除a个元素。

答案 5 :(得分:0)

您可以简单地random.shuffle您的数组,而不是使用choice,即

random.shuffle(a)  # will shuffle a in-place

答案 6 :(得分:0)

这是一个简单的解决方案,只需从范围函数中进行选择即可。

import numpy as np
a = [100,400,100,300,300,200,100,400]
I=np.random.choice(np.arange(len(a)))
print('index is '+str(I)+' number is '+str(a[I]))

答案 7 :(得分:0)

也许晚了,但是值得一提的是,我认为最简单的方法是:

a = [1,4,1,3,3,2,1,4]
n = len(a)
idx = np.random.choice(list(range(n)), p=np.ones(n)/n)

这意味着您正在从索引中选择。在更一般的情况下,您可以通过以下方式进行加权采样(并返回索引):

probs = [.3, .4, .2, 0, .1]
n = len(a)
idx = np.random.choice(list(range(n)), p=probs)

如果您尝试了很多次(例如1e5),则在这种情况下,所选索引的直方图将类似于[0.30126 0.39817 0.19986 0. 0.10071]

无论如何,您应该从索引中进行选择,并使用值(如果需要)作为其概率。