Вот один из способов сделать это, предполагая, что у вас уже есть матрица. (Вопрос говорит заполнить матрицу, а не создать матрицу)
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)
Что вы говорите, 10 х 5 вы имеете в виду список с 10 элементов каждый содержащий 5 элементов или список из 5 элементов, каждый из которых содержит 10 элементов? – Keatinge
Спасибо Keatinge, мой A - массив с 10 строками и 5 столбцами. Спасибо – user1301295
Что бы я хотел, это почти что-то вроде 'np.random.choice ([0, 1, 3], 10 * 5, size = (10,5))', при условии, что столбец должен иметь один и только одно появление и одно и только одно «1». – user1301295