随机,非重复的2D列表Python

时间:2016-11-14 21:08:35

标签: python list numpy random

我有一个程序可以生成一个二维列表,其中包含一定范围内的一组二维坐标。 (嵌套是列表或元组并不重要)例如:

[[5, 0], [4, 6], [9, 7], [2, 9], [2, 6]]

问题在于我希望在保持外部列表的长度不变的情况下,没有两个子列表相同。

我尝试过使用random.sample:

pointx = random.sample(range(10),5)
pointy = random.sample(range(20),5)
points = list(zip(pointx,pointy))

其中10是x范围,20是y范围,5是点数:

[(1,0),(9,19),(8,13),(3,5),(0,14)]

然而,这种方法的最大点数仅为10 + 20,因为单独的样本列表显然应该是10 * 20。

写这篇文章时,我意识到:

point2D = []
point1D = random.sample(range(10*20),5)
[point2D.append(divmod(i,10)) for i in point1D]

这是一种可行的方法,但也很笨拙,我想知道是否有更好的解决可能涉及numpy。

提前致谢。

2 个答案:

答案 0 :(得分:0)

想象一个2D形状(10,20)网格,每个整数点都有点。现在,我们要说我们要在此网格上选择5个唯一点。这就是全部!我们将此翻译为NumPy。

从所有可能的5索引中选择200个唯一索引:

idx = np.random.choice(200, size=5, replace=0)

将这些索引转换为xy坐标,这些坐标以矩阵术语表示,获取行和列索引:

row, col = np.unravel_index(idx,(10,20))

这些将是所需的元组。

让我们将这两个步骤放在一起,以获得完整的代码 -

idx = np.random.choice(200, size=5, replace=0)
out = np.column_stack((np.unravel_index(idx,(10,20))))

让我们使用一个示例案例 -

In [461]: idx = np.random.choice(200, size=5, replace=0)
     ...: out = np.column_stack((np.unravel_index(idx,(10,20))))
     ...: 

In [462]: out
Out[462]: 
array([[ 6, 18],
       [ 9, 17],
       [ 5,  7],
       [ 8,  2],
       [ 6, 12]])

答案 1 :(得分:0)

使用numpy,我们可以创建所有有序的(x,y)对,然后随机选择多个对。

# first create an array of all possible pairs from (0,0) to (9,19)
pairs = np.dstack(np.meshgrid(np.arange(10), np.arange(20))).reshape(-1,2)

# now select a random set of 25 of those pairs, which are unique
pairs[np.random.choice(np.arange(pairs.shape[0]), size=25, replace=False)]