2016-11-14 337 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)]