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

问题描述 投票:6回答:2

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

numpy random choice
2个回答
16
投票

好吧,我知道了。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)

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

应该适用于任何列数的二维矩阵 当然,你可以用这个函数进行任意次数的采样 size kwarg等。

© www.soinside.com 2019 - 2024. All rights reserved.