numpy.random.choice和random.choice的输入参数有区别吗?
Posted
技术标签:
【中文标题】numpy.random.choice和random.choice的输入参数有区别吗?【英文标题】:Is there a difference between the input paramaters of numpy.random.choice and random.choice? 【发布时间】:2017-09-25 16:11:17 【问题描述】:为什么 numpy.random.choice 与 random.choice 不一样?当我这样做时:
>>> random.choice([(1,2),(4,3)])
(1, 2)
有效。
但是当我这样做时:
>>> np.random.choice([(1,2), (3,4)])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "mtrand.pyx", line 1393, in mtrand.RandomState.choice
(numpy/random/mtrand/mtrand.c:15450)
ValueError: a must be 1-dimensional
如何在 numpy.random.choice() 中实现与 random.choice() 相同的行为?
【问题讨论】:
【参考方案1】:与此相关,如果您想像这样随机采样 行 2D 矩阵
x = np.array([[1, 100], [2, 200], [3, 300], [4, 400]])
那么你可以这样做:
n_rows = x.shape[0]
x[np.random.choice(n_rows, size=n_rows, replace=True), :]
应该适用于具有任意列数的二维矩阵,当然您可以使用size
kwarg 等进行多次采样。
【讨论】:
谢谢,这就是我要找的。span> 【参考方案2】:正如文档中所述,np.random.choice
需要一个一维数组,而您的输入在表示为数组时将是 2D
。所以,它不会像那样简单地工作。
为了让它工作,我们可以输入输入的长度,让它选择一个索引,当索引到输入中时,它与random.choice
中的索引相同,如下所示 -
out = a[np.random.choice(len(a))] # a is input
示例运行 -
In [74]: a = [(1,2),(4,3),(6,9)]
In [75]: a[np.random.choice(len(a))]
Out[75]: (6, 9)
In [76]: a[np.random.choice(len(a))]
Out[76]: (1, 2)
或者,我们可以将输入转换为对象 dtype 的一维数组,这样我们就可以直接使用np.random.choice
,如下所示 -
In [131]: a0 = np.empty(len(a),dtype=object)
In [132]: a0[:] = a
In [133]: a0.shape
Out[133]: (3,) # 1D array
In [134]: np.random.choice(a0)
Out[134]: (6, 9)
In [135]: np.random.choice(a0)
Out[135]: (4, 3)
【讨论】:
当然可以,但必须这样做非常笨拙。我只想从一维对象数组中随机采样。 numpy.random.choice() 应该简单地随机选择一个索引并将相应的对象返回给我。不知道为什么它不模仿具有直觉行为的 random.choice() 函数。强制我列表中的对象属于某种类型确实超出了目的。 @user3079275 这就是np.random.choice
的设计方式,要么使用笨拙的设置来适应这种情况,要么创建我们自己的自定义设置。添加了另一个具有绕过它的对象 dtype 的对象。
a[np.random.choice(len(a),size=(2,3))]
并不笨拙,至少在我看来不是。它只增加了一层索引。有了这个,我可以很容易地选择a
的随机列,或者更高维度的随机平面。以上是关于numpy.random.choice和random.choice的输入参数有区别吗?的主要内容,如果未能解决你的问题,请参考以下文章
在某个预定义的间隔内使用抽屉绘制随机数,`numpy.random.choice()`
Python 中的 numpy.random.choice()