首页 > 解决方案 > 有没有办法获得具有唯一行的矩阵?

问题描述

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

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

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

标签: pythonpython-3.xmatrixunique

解决方案


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

从间隔创建tuples数字并将它们添加到 a中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]]

对于分区,您可以阅读如何将列表拆分为大小均匀的块?


推荐阅读