2016-09-30 10 views
0

행렬에 정수 값이 있다고 가정합니다. 확률 행렬 (행렬의 각 행을 1과 합한 행)을 만들어야합니다.확률 행렬 정규화에 대한 정수 행렬

무작위 행렬을 만들고 각 행의 개수 합을 계산하고 행 합계를 위해 행의 각 요소를 나눕니다.

dt = pd.DataFrame(np.random.randint(0,10000,size=10000).reshape(100,100)) 
dt['sum_row'] = dt.sum(axis=1) 
for col_n in dt.columns[:-1]: 
    dt[col_n] = dt[col_n]/dt['sum_row'] 

각 행의 합계는 1과 같아야합니다. 그러나 그렇지 않습니다.

(dt.sum_row_normalized == 1).value_counts() 
> False 75 
> True  25 
> Name: sum_row_normalized, dtype: int64 

일부 값은 정확히 1이 아니지만 아주 가깝다는 것을 알고 있습니다. 그럼에도 불구하고 어떻게 행렬을 올바르게 정규화 할 수 있습니까?

+1

주 (당신은 파이썬 3.x의에서 .astype(float) 단계가 필요하지 않습니다) 'float' 처음 :'dt [col_n]/float (dt [ 'sum_row'])'. –

답변

1

부동 소수점이 정확히 1이 될 것이라고 보장 할 수는 없지만 임의의 정밀도로 가깝게는 np.around으로 확인할 수 있습니다.

이것은 판다 열을 반복하지 않고도 더 쉽고 빠를 것입니다.

X = np.random.randint(0,10000,size=10000).reshape(100,100) 
X_float = X.astype(float) 
Y = X_float/X_float.sum(axis=1)[:,np.newaxis] 

sum(np.around(Y.sum(axis=1),decimals=10)==1) # is 100 

는 3/2 == 파이썬 2의 1 '가 부문에서 두 개의 번호 중 하나를 변환 시도'것을