我经常使用的一个技巧是生成一个随机数组,并
argsort用于获取唯一索引作为所需的唯一数字。因此,我们可以-
def random_choice_noreplace(m,n, axis=-1): # m, n are the number of rows, cols of output return np.random.rand(m,n).argsort(axis=axis)
样品运行-
In [98]: random_choice_noreplace(3,7)Out[98]: array([[0, 4, 3, 2, 6, 5, 1], [5, 1, 4, 6, 0, 2, 3], [6, 1, 0, 4, 5, 3, 2]])In [99]: random_choice_noreplace(5,7, axis=0) # unique nums along colsOut[99]: array([[0, 2, 4, 4, 1, 0, 2], [1, 4, 3, 2, 4, 1, 3], [3, 1, 1, 3, 2, 3, 0], [2, 3, 0, 0, 0, 2, 4], [4, 0, 2, 1, 3, 4, 1]])
运行时测试-
# Original approachdef loopy_app(m,n): a = (np.random.choice(n,size=n,replace=False) for _ in range(m)) return np.vstack(a)
时间-
In [108]: %timeit loopy_app(1000,100)10 loops, best of 3: 20.6 ms per loopIn [109]: %timeit random_choice_noreplace(1000,100)100 loops, best of 3: 3.66 ms per loop



