Замена ненулевых значений в матрице маргиналами - PullRequest
0 голосов
/ 26 мая 2019

Я пытаюсь сделать некоторую математику с моей матрицей, я могу записать ее, но я не уверен, как ее кодировать.Это включает получение столбца предельных значений строк, а затем создание новой матрицы, в которой все ненулевые значения строк заменяются на предельные значения, после чего я хотел бы разделить сумму ненулевых новых значений на предельные значения столбцов.

Я могу добраться до маргинальных строк, но, похоже, не могу придумать способ их заселения.

пример того, что я хочу

import numpy as np

matrix = np.matrix([[1,3,0],[0,1,2],[1,0,4]])

matrix([[1, 3, 0],
        [0, 1, 2],
        [1, 0, 4]])

marginals = ((matrix != 0).sum(1) / matrix.sum(1))

matrix([[0.5       ],
        [0.66666667],
        [0.4       ]])

Далее я хочу заполнить матрицу на основе ненулевых позиций первого.


matrix([[0.5, 0.5, 0],
        [0, 0.667, 0.667],
        [0.4, 0, 0.4]])

Окончательный требуемый результат - сумма столбца новой матрицы, разделенная на число ненулевых вхождений в этом столбце.


matrix([[(0.5+0.4)/2, (0.5+0.667)/2, (0.667+0.4)/2]])

1 Ответ

2 голосов
/ 26 мая 2019

Чтобы получить окончательную матрицу, мы можем использовать matrix-multiplication для эффективности -

In [84]: mask = matrix!=0

In [100]: (mask.T*marginals).T/mask.sum(0)
Out[100]: matrix([[0.45      , 0.58333334, 0.53333334]])

Или проще -

In [110]: (marginals.T*mask)/mask.sum(0)
Out[110]: matrix([[0.45      , 0.58333334, 0.53333334]])

Если вам нужен этот промежуточный заполненный для вывода также используйте np.multiply для широковещательного умножения -

In [88]: np.multiply(mask,marginals)
Out[88]: 
matrix([[0.5       , 0.5       , 0.        ],
        [0.        , 0.66666667, 0.66666667],
        [0.4       , 0.        , 0.4       ]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...