所以我想知道是否存在一种更有效的解决方案,该方法使用np.random.choice每行具有唯一值的位置生成二维数组。
例如,对于具有shape的数组(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之间。
我知道,我可以通过传递实现它False的replace论据。但是我只能为每一行而不是整个矩阵执行此操作。例如,我可以这样做:
>>> 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
万千封印
相关分类