为什么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()相同的行为?
答案 0 :(得分:14)
正如文档中所提到的那样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的1D数组,这样我们就可以直接使用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)
答案 1 :(得分:2)
相关地,如果你想随机采样像这样的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), :]
应该适用于具有任意数量列的2D矩阵,您当然可以使用size
kwarg等多次对其进行采样。