Случайным образом заполнить 2d матрицу условиями

Вот моя ситуация, и я просто выкидываю ее, чтобы получить идеи, как к ней подойти.

У меня есть категории categories = [0, 1, 3] и 10 x 5 матрица, А

Как я могу заполнить матрицу A случайным выбором из категорий таким образом, чтобы в каждом столбце было ОДНО и только ОДНО вхождение "0" и ОДНО и только ОДНО вхождение "1"?

Мой мыслительный процесс:

For each column, Cj, 
    create list L = selection of random integers between [0,9] ( no replacement) 
    Set Cj[k[0]] = 0 and Cj[k[1]] = 1 
    Set Cj[k[i]] , i=2, ..,9

У кого-нибудь есть лучший способ решения этой проблемы?

2 ответа

Решение

Вот один из способов сделать это, если у вас уже есть матрица. (Вопрос гласит заполнить матрицу, а не создавать матрицу)

import pprint
import random

categories = [0,1,3] #complete pool of numbers
restrictedNumbers = [0, 1] #numbers to only appear once
unrestrictedNumbers = [num for num in categories if num not in restrictedNumbers] #can appear any number of times

matrix = [[0, 0, 0, 0, 0] for l in range(10)] #10 rows, 5 columns matrix of zeros
newMatrix = []

for row in matrix:
    tempRow = restrictedNumbers #first add the restricted numbers since they must appear once
    while len(tempRow) < len(row): #keep adding numbers from unrestricted till lengths are equal
        tempRow.append(random.choice(unrestrictedNumbers))
    random.shuffle(tempRow) 
    newMatrix.append(tempRow[:]) #finally add the shuffled row to newMatrix
pprint.pprint(newMatrix)

Это дает вывод: (очевидно, будет меняться из-за случайного)

[[3, 1, 3, 0, 3],
 [3, 3, 0, 1, 3],
 [0, 3, 1, 3, 3],
 [0, 3, 1, 3, 3],
 [3, 3, 0, 3, 1],
 [0, 1, 3, 3, 3],
 [1, 0, 3, 3, 3],
 [1, 3, 0, 3, 3],
 [3, 3, 0, 3, 1],
 [3, 0, 1, 3, 3]]

Вы можете видеть, что каждая строка имеет один 0 и 1

Вот еще более короткий путь:

import pprint
import random

categories = [0,1,3] #complete pool of numbers
restrictedNumbers = [0, 1] #numbers to only appear once
unrestrictedNumbers = [num for num in categories if num not in restrictedNumbers] #can appear any number of times

matrix = [[0, 0, 0, 0, 0] for l in range(10)] #10 rows, 5 columns matrix of zeros
newMatrix = []
for row in matrix:
    row = restrictedNumbers + [random.choice(unrestrictedNumbers) for _ in range(len(row)-len(restrictedNumbers))]
    random.shuffle(row)
    newMatrix.append(row)
pprint.pprint(newMatrix)



И даже короче этого (это было бы одной строкой, если random.shuffle возвратил список вместо перемешивания на месте)

import pprint
import random

categories = [0,1,3] #complete pool of numbers
restrictedNumbers = [0, 1] #numbers to only appear once
unrestrictedNumbers = [num for num in categories if num not in restrictedNumbers] #can appear any number of times

matrix = [[0, 0, 0, 0, 0] for l in range(10)] #10 rows, 5 columns matrix of zeros
def returnShuffled(startList):
    random.shuffle(startList)
    return startList

newMatrix = [returnShuffled(restrictedNumbers + [random.choice(unrestrictedNumbers) for _ in range(len(row) - len(restrictedNumbers))]) for row in matrix]
pprint.pprint(newMatrix)

Ваш вопрос немного расплывчатый. Пожалуйста, предоставьте более подробную информацию о том, что вы можете иметь в других позициях. если одна позиция равна 0 и 1 позиция равна 1, а другие позиции могут быть любыми, чем использовать это.

сделать массив [number_of_columns] = {0,1,2,2,....,2], перемешать его. затем для каждой позиции в столбце (i) if (array[i] = 0){array_you_are_making[i]=0};if(array[i] = 1){array_you_are_making[i]=1};if(array[i] = 2){array_you_are_making[i]="do something"};

Звучит как случай для метода Python shuffle().

Другие вопросы по тегам