2016-11-14 111 views
1

我有一个程序可以生成一个二维列表,其中包含一定数量的二维坐标在一定范围内的二维列表。 (这并不重要,如果嵌套的列表或元组),例如:随机,非重复2D列表Python

[[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的。

在此先感谢。

+0

上述方法的最大点数是155而不是200或30.对于第一个'x'有20个可能的'y's,那么对于第二个'x'有'19''' y等等,直到你得到20 + 19 + ... + 11 = 155'。 –

+0

那么,这两种解决方案都适合你吗? – Divakar

回答

0

想象一下2D形状(10,20)的网格,在每个整数点处都有点。现在,假设我们想在此网格上选择5独特点。就这样!我们把它翻译成NumPy。

从所有可能的200指数与选择5唯一索引:

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]]) 
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)]