python中随机生成数字生成对了是猜对了,如何在Python中生成随机数对,包括一个条目相同的对,排除两个条目相同的对?...

假设您的x和y坐标都是0到n之间的整数。对于小的n来说,一个简单的方法可能是使用np.mgrid生成所有可能的xy坐标集,将其重塑为一个(nx * ny, 2)数组,然后从中对随机行进行采样:nx, ny = 100, 200

xy = np.mgrid[:nx,:ny].reshape(2, -1).T

sample = xy.take(np.random.choice(xy.shape[0], 100, replace=False), axis=0)

如果nx和/或ny非常大,创建所有可能坐标的数组可能会变得非常昂贵,在这种情况下,最好使用生成器对象并跟踪以前使用的坐标,如James的答案所示。

根据晨曦的建议,另一种方法是从nx*ny索引集合中抽取样本,然后将其直接转换为x,y坐标,这样就避免了构建整个nx*ny可能的x,y排列数组。

为了进行比较,这里是我的原始方法的一个版本,该方法是针对N维数组的,加上使用新方法的版本:def sample_comb1(dims, nsamp):

perm = np.indices(dims).reshape(len(dims), -1).T

idx = np.random.choice(perm.shape[0], nsamp, replace=False)

return perm.take(idx, axis=0)

def sample_comb2(dims, nsamp):

idx = np.random.choice(np.prod(dims), nsamp, replace=False)

return np.vstack(np.unravel_index(idx, dims)).T

实际上并没有太大的差别,但是第二种方法的好处对于更大的阵列来说就更加明显了:In [1]: %timeit sample_comb1((100, 200), 100)

100 loops, best of 3: 2.59 ms per loop

In [2]: %timeit sample_comb2((100, 200), 100)

100 loops, best of 3: 2.4 ms per loop

In [3]: %timeit sample_comb1((1000, 2000), 100)

1 loops, best of 3: 341 ms per loop

In [4]: %timeit sample_comb2((1000, 2000), 100)

1 loops, best of 3: 319 ms per loop

如果您安装了scikit learn,^{}提供了一种更快的方法来生成随机索引,而不使用Floyd's algorithm进行替换:from sklearn.utils.random import sample_without_replacement

def sample_comb3(dims, nsamp):

idx = sample_without_replacement(np.prod(dims), nsamp)

return np.vstack(np.unravel_index(idx, dims)).T

In [5]: %timeit sample_comb3((1000, 2000), 100)

The slowest run took 4.49 times longer than the fastest. This could mean that an

intermediate result is being cached

10000 loops, best of 3: 53.2 µs per loop

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值