如何使用numpy从列表中随机选择n个元素?

Posted

技术标签:

【中文标题】如何使用numpy从列表中随机选择n个元素?【英文标题】:How to get randomly select n elements from a list using in numpy? 【发布时间】:2017-01-26 14:14:49 【问题描述】:

我有一个向量列表:

>>> import numpy as np
>>> num_dim, num_data = 10, 5
>>> data = np.random.rand(num_data, num_dim)
>>> data
array([[ 0.0498063 ,  0.18659463,  0.30563225,  0.99681495,  0.35692358,
         0.47759707,  0.85755606,  0.39373145,  0.54677259,  0.5168117 ],
       [ 0.18034536,  0.25935541,  0.79718771,  0.28604057,  0.17165293,
         0.90277904,  0.94016733,  0.15689765,  0.79758063,  0.41250143],
       [ 0.80716045,  0.84998745,  0.17893211,  0.36206016,  0.69604008,
         0.27249491,  0.92570247,  0.446499  ,  0.34424945,  0.08576628],
       [ 0.35311449,  0.67901964,  0.71023927,  0.03120829,  0.72864953,
         0.60717032,  0.8020118 ,  0.36047207,  0.46362718,  0.12441942],
       [ 0.1955419 ,  0.02702753,  0.76828842,  0.5438226 ,  0.69407709,
         0.20865243,  0.12783666,  0.81486189,  0.95583274,  0.30157658]])

data,我需要随机选择3个向量,我可以这样做:

>>> import random
>>> random.sample(data, 3)
[array([ 0.80716045,  0.84998745,  0.17893211,  0.36206016,  0.69604008,
        0.27249491,  0.92570247,  0.446499  ,  0.34424945,  0.08576628]), array([ 0.18034536,  0.25935541,  0.79718771,  0.28604057,  0.17165293,
        0.90277904,  0.94016733,  0.15689765,  0.79758063,  0.41250143]), array([ 0.35311449,  0.67901964,  0.71023927,  0.03120829,  0.72864953,
        0.60717032,  0.8020118 ,  0.36047207,  0.46362718,  0.12441942])]

我检查了http://docs.scipy.org/doc/numpy/reference/routines.random.html 的文档,但我无法确定numpy 中是否有random.sample() 这样的功能。

numpy.random.sample()random.sample()不一样对吗?

random.sample() 是否与 numpy 等价?

【问题讨论】:

我想你正在寻找np.random.choice。尽管您需要传递 replace=False 才能使其表现得像 random.sample 你想做什么numpy.random.sample 做了(或不做)你想要(或不想要)它做什么? @brenbarn 我需要随机选择 n 号。向量列表中的元素。 @ayhan,类似于:data[np.random.choice(range(len(data)), size=3, replace=False)]? 是的,完全正确。你不需要range。您可以传递一个整数,然后它将从np.arange(n) 中进行选择。 【参考方案1】:

正如@ayhan 确认的那样,可以这样做:

>>> data[np.random.choice(len(data), size=3, replace=False)]
array([[ 0.80716045,  0.84998745,  0.17893211,  0.36206016,  0.69604008,
         0.27249491,  0.92570247,  0.446499  ,  0.34424945,  0.08576628],
       [ 0.35311449,  0.67901964,  0.71023927,  0.03120829,  0.72864953,
         0.60717032,  0.8020118 ,  0.36047207,  0.46362718,  0.12441942],
       [ 0.1955419 ,  0.02702753,  0.76828842,  0.5438226 ,  0.69407709,
         0.20865243,  0.12783666,  0.81486189,  0.95583274,  0.30157658]])

来自docs:

numpy.random.choice(a, size=None, replace=True, p=None)

从给定的一维数组生成随机样本

np.random.choice(data, size=3, replace=False)data 的索引列表中选择 3 个元素而不进行替换。

然后data[...] 对索引进行切片并检索使用np.random.choice 选择的索引。

【讨论】:

以上是关于如何使用numpy从列表中随机选择n个元素?的主要内容,如果未能解决你的问题,请参考以下文章

从 C# 中的 List<T> 中选择 N 个随机元素的算法[重复]

如何在 Python 中列出 n 个数字并随机选择任意数字?

随机优先与权重——非平均概率的选择工具

jAVA如何使一个数组里面的元素随机交换位置

如何利用Python随机从list中挑选一个元素

从 C# 中的 List<T> 中选择 N 个随机元素