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()`

未选择的numpy random.choice 元素

Python 中的 numpy.random.choice()

对随机矩阵的所有行进行快速随机加权选择

numpy 1.9.0:ValueError:概率总和不等于 1

11.24学习