Есть ли способ получить матрицу с уникальными строками? - PullRequest
0 голосов
/ 15 февраля 2019

Я ищу способ сгенерировать матрицу со значениями целых чисел в пределах интервала, где каждая строка матрицы будет уникальной (то есть набор элементов, из которых состоит строка, не будет точно набором элементовлюбая другая строка) По сути, я ищу матричный эквивалент строки:

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

, где в основном я создаю уникальную строку и добавляю ее.Но при этом существует опасность, что два ряда будут иметь одинаковые элементы (даже в разном порядке).

1 Ответ

0 голосов
/ 15 февраля 2019

set() s может содержать только уникальные элементы - кортежи могут быть хэшируемыми и могут быть помещены в set.

Создать tuples чисел из интервала и добавить их в set доset длина соответствует вашему количеству строк.Затем создайте список списков из 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]]

Подробнее о разбиении вы можете прочитать в Как разбить список на куски одинакового размера?

...