【问题标题】:Random, Non-Repeating 2D List Python随机、非重复的二维列表 Python
【发布时间】:2017-03-28 15:04:03
【问题描述】:

我有一个程序可以生成一个二维列表,其中包含一定范围内的一组二维坐标。 (嵌套是列表还是元组都没有关系)例如:

[[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 的更好的解决方案。

提前致谢。

【问题讨论】:

  • 上述方法的最大点数是155而不是200或30。对于第一个x有20个可能ys,然后对于第二个x19可能ys 等,直到你得到 20 + 19 + ... + 11 = 155
  • 那么,发布的任何一个解决方案都对您有用吗?

标签: python list numpy random


【解决方案1】:

想象一个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]])

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-22
      • 2021-02-28
      • 2014-02-14
      • 1970-01-01
      • 2014-11-19
      • 1970-01-01
      • 1970-01-01
      • 2013-05-09
      相关资源
      最近更新 更多