numpy.random.choice和random.choice的输入参数有区别吗?

Is there a difference between the input paramaters of numpy.random.choice and random.choice?

为什么 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() 相同的行为?

好吧 np.random.choice 如文档中所述,需要一个一维数组,并且当表示为数组时您的输入将是 2D。所以,它不会像那样简单地工作。

为了让它工作,我们可以输入输入的长度并让它 select 一个索引,当索引到输入中时,它与 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)

相关地,如果你想随机抽样 的二维矩阵

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), :]

应该适用于具有任意数量列的 2D 矩阵,您当然可以使用 size kwarg 等多次采样