我想知道是否有更有效的方法使用np.random.choice
生成一个二维数组,其中每一行都具有唯一的值。
例如,对于形状为(3,4)
的数组,我们期望输出如下:
# Expected output given a shape (3,4)
array([[0, 1, 3, 2],
[2, 3, 1, 0],
[1, 3, 2, 0]])
这意味着每行的值在列数方面必须是唯一的。因此,对于out
中的每一行,整数应该只落在0到3之间。
我知道可以通过将replace
参数设置为False
来实现它。但我只能针对每一行而不是整个矩阵这样做。例如,我可以这样做:
>>> np.random.choice(4, size=(1,4), replace=False)
array([[0,2,3,1]])
但是当我尝试做这个时:
>>> np.random.choice(4, size=(3,4), replace=False)
我遇到了这样的错误:
File "<stdin>", line 1, in <module>
File "mtrand.pyx", line 1150, in mtrand.RandomState.choice
(numpy\random\mtrand\mtrand.c:18113)
ValueError: Cannot take a larger sample than population when
'replace=False'
我猜是因为它尝试着在不重复的情况下绘制 3 x 4 = 12
个样本,但是我只给了它一个 4
的限制。
我知道可以通过使用 for-loop
来解决:
>>> a = (np.random.choice(4,size=4,replace=False) for _ in range(3))
>>> np.vstack(a)
array([[3, 1, 2, 0],
[1, 2, 0, 3],
[2, 0, 3, 1]])
但是我想知道是否有一种方法可以不使用任何for循环来解决?(我认为如果行数大于1000,添加for循环可能会使它变慢。但是,正如您所看到的,我实际上正在a
中创建一个生成器,因此我也不确定它是否会产生影响。)
x
进行抽样,那么这意味着我正在取一个小于len(x)
的样本大小,否则样本将始终与x
相同,除了顺序。因此,如果我想从x
中随机抽取y
个元素,这种方法将确保我只能从x
的前y
个值中进行抽取... - pretzlstylerandom_choice_noreplace(1000,100)[:,:20]
,其中100
是数组的长度,而你想要 20 个样本。 - Divakar