【问题标题】:Is there a way to get a matrix with unique rows?有没有办法获得具有唯一行的矩阵?
【发布时间】:2019-02-15 14:13:27
【问题描述】:

我正在寻找一种方法来生成一个间隔内具有整数值的矩阵,其中矩阵的每一行都是唯一的(即,一行所包含的元素集合将不完全是元素的集合任何其他行)基本上,我正在寻找相当于行的矩阵:

random.sample(range(0, 35), i+1

编辑:

矩阵大小在每次迭代后都会发生变化。区间为 0-35。 目前我已经实现了这个

for j in range (5):
    comb_elms_list.append(random.sample(range(0, 35), i+1))

基本上我创建一个唯一的行并附加它。但这有两行将具有相同元素(即使顺序不同)的危险。

【问题讨论】:

标签: python python-3.x matrix unique


【解决方案1】:

set()s 只能保存唯一元素 - 元组是可散列的,可以放入 set

从一个区间创建 tuples 的数字并将它们添加到 set 中,直到 set-length 与您的行数匹配。然后从set 创建一个列表列表:

import random

interval = range(100) # plenty more numbers then neeeded to fill 5*3 w/o repeats

matrix = (5,3)

ranges= set()
while len(ranges) < matrix[0]:
    ranges.add(tuple(random.sample(interval, k=matrix[1])))

matrix = [ list(t) for t in ranges ]

print(matrix)

确保您有足够大的间隔,否则您将一遍又一遍地获得相同的元组,而您的 while 将永远无法完成。

输出:

[[23, 16, 93], [50, 60, 38], [86, 12, 3], [35, 28, 89], [77, 47, 36]]

如果您想在您的范围内使用 所有 个数字,则更容易将它们打乱并对其进行分区:

import random

matrix = (5,3)           # dimension of matrix
m = matrix[0]*matrix[1]  # total numbers needed

interval = random.sample(range(m), k=m) # create a shuffled list of the complete range

# partition the list into correctly sized intervals    
k = [ interval[i*matrix[1]:(i+1)*matrix[1]] for i in range(matrix[0])]


print(k) # [[12, 3, 4], [2, 11, 8], [10, 5, 14], [1, 0, 6], [13, 9, 7]]

关于分区,您可以在How do you split a list into evenly sized chunks?阅读更多内容

【讨论】:

  • 感谢您的回答。它并没有完全符合我的要求,但这已经足够了,谢谢!
猜你喜欢
  • 2018-07-11
  • 2020-02-24
  • 1970-01-01
  • 2012-11-04
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多