2016-09-30 21 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/2 == 1' в Python 2. Попробуйте преобразовать один из двух чисел в дивизии сначала 'float':' dt [col_n]/float (dt ['sum_row']) '. –

ответ

1

Вы не можете гарантировать, что поплавки будут точно такими же, но вы можете точно проверить произвольную точность с помощью np.around.

Это, вероятно, проще и быстрее, не зацикливая столбцы pandas.

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 

(вам не нужно .astype(float) шаг в питона 3.x)