2016-06-10 4 views
2

여기 내 상황이 있습니다. 접근 방법에 대한 아이디어를 얻으려고 저만을 던지고 있습니다.무작위로 2 차원 행렬에 조건을 채우십시오.

는 I는

가 어떻게 각 열에 하나는 '0'과 ONE을 하나만 하나만 발생 있어야되도록 범주에서 임의로 선택하여 행렬 (A)을 채울 수있는 카테고리 categories = [0, 1, 3]10 x 5 행렬을 가지고 '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 개 개의 요소 각각 목록을 의미합니까 (random.shuffle 대신 장소에서 셔플의 목록을 반환하는 경우이 한 줄 것) 것보다 훨씬 더 짧은 5 개의 요소를 포함하는 목록 또는 각각 10 개의 요소를 포함하는 5 개의 요소가있는 목록? – Keatinge

+0

감사합니다 Keatinge, 내 A는 10 행 5 열을 가진 배열입니다. 감사합니다 – user1301295

+0

제가 원했던 것은'np.random.choice ([0, 1, 3], 10 * 5, size = (10,5))'와 거의 비슷합니다. 한 번은 0 번 발생하고 한 번만 '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) 



그리고

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"};

파이썬 셔플() 메소드의 경우와 같습니다.

+0

감사합니다 sixtytrees, 내 질문에 오타가 있었는데, 나는'Set Cj [k]] = 3, i = 2, .., 9. '을 의미했습니다. – user1301295