是否可以修改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]
)。
答案 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]
。
无论如何,您应该从索引中进行选择,并使用值(如果需要)作为其概率。