[英]Random, Non-Repeating 2D List 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。
提前致謝。
想象一下2D
網格形狀(10,20)
,每個整數點都有點。 現在,假設我們要在此網格上選擇5
唯一點。 就這樣! 我們將此翻譯為NumPy。
從所有可能的200
指數中選擇5
唯一指數:
idx = np.random.choice(200, size=5, replace=0)
將這些索引轉換為以矩陣術語表示的x
和y
坐標,獲取行和列索引:
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]])
使用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)]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.