2016-06-10 20 views
2

Hier ist meine Situation, und ich bin nur werfen es da draußen, um Ideen zu bekommen, wie man es angehen.zufällig 2d Matrix mit Bedingungen füllen

Ich habe Kategorien categories = [0, 1, 3] und eine 10 x 5 Matrix, A

Wie kann ich Matrix A mit zufälliger Auswahl von Kategorien, wie füllen, dass jede Spalte ein und nur ein Vorkommen von ‚0‘ und einem und nur ein Vorkommen haben muss von '1'?

Mein Denkprozess ist:

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 

Hat jemand einen besseren Weg, dieses Problem zu lösen?

+0

Was Sie sagen, 10 x 5 meinst du eine Liste mit 10 Elementen je enthält 5 Elemente oder eine Liste mit 5 Elementen mit je 10 Elementen? – Keatinge

+0

Danke Keatinge, mein A ist ein Array mit 10 Zeilen und 5 Spalten. Danke – user1301295

+0

Was ich möchte ist fast so etwas wie 'np.random.choice ([0, 1, 3], 10 * 5, size = (10,5))', unter der Voraussetzung, dass eine Spalte nur eine haben darf ein 0 Vorkommen und ein und nur ein '1' Vorkommen. – user1301295

Antwort

2

Hier ist ein Weg, es zu tun vorausgesetzt, Sie haben bereits die Matrix. (Die Frage sagt eine Matrix füllen, schaffen keine Matrix)

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) 

Diese den Ausgang gibt: (natürlich wird wegen zufälliger variieren)

[[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]] 

Sie können jede Zeile sehen eine einzelne hat 0 und Single ein

Hier ist ein noch kürzerer Weg:

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) 



Und sogar kürzer als die (diese eine Zeile wäre, wenn random.shuffle die Liste zurückgegeben statt anstelle von schlurfenden)

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

Tolles Zeug, nur Zeilen Spalten umgekehrt, ... das ist einfach zu reparieren. obwohl – user1301295

1

Ihre Frage ist ein bisschen vage. Bitte geben Sie weitere Informationen darüber, was Sie in anderen Positionen haben können. wenn eine Position 0 ist und 1 Position 1 ist und die anderen Positionen beliebig sein können, dann benutze diese.

machen Sie ein Array [number_of_columns] = {0,1,2,2, ...., 2], Mischen Sie es. dann für jede Position in der Spalte (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"};

Klingt wie ein Fall für eine Python shuffle() -Methode.

+0

Danke sechzig Bäume, ich hatte einen Tippfehler in meiner Frage, ich meinte 'Set Cj [k [i]] = 3, i = 2, .., 9.' – user1301295