2016-06-10 10 views
2

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

меня Категории categories = [0, 1, 3] и 10 x 5 матрицу, А

Как я могу заполнить матрицу А со случайным выбором из категорий, такие, что каждый столбец должен иметь одно и только одно вхождения «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 

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

+0

Что вы говорите, 10 х 5 вы имеете в виду список с 10 элементов каждый содержащий 5 элементов или список из 5 элементов, каждый из которых содержит 10 элементов? – Keatinge

+0

Спасибо Keatinge, мой A - массив с 10 строками и 5 столбцами. Спасибо – user1301295

+0

Что бы я хотел, это почти что-то вроде 'np.random.choice ([0, 1, 3], 10 * 5, size = (10,5))', при условии, что столбец должен иметь один и только одно появление и одно и только одно «1». – user1301295

ответ

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

Отличный материал, только столбцы строк обращены, ... это легко исправить. хоть – user1301295

1

Ваш вопрос немного расплывчатый. Просьба представить более подробную информацию о том, что вы можете иметь на других должностях. если одна позиция равна 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"};

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

+0

Спасибо шестидесяти, у меня была опечатка в моем вопросе, я имел в виду 'Set Cj [k [i]] = 3, i = 2, .., 9.' – user1301295

 Смежные вопросы

  • Нет связанных вопросов^_^