Объединять матрицы по строкам, взвешивая их в Python - PullRequest
1 голос
/ 14 октября 2019

У меня есть N матрицы с размерами R x R и одна «Весовая матрица» с размерами R x N. Теперь я хочу объединить эти N матрицы по строкам, взвесив их с помощью «матрицы весов». В конце я хочу матрицу R x R .

Позвольте мне показать вам пример: в следующем примере мои исходные матрицы - это a и b, а моя весовая матрица - c. Желаемый результат - матрица r.

Первая строка r является первой строкой a, поскольку c [0,0] равно 1, а c [0,1] равно 0, поэтому мы просто рассмотрим первую строку матрицы a.

Вторая строка r представляет собой средневзвешенное значение строки 2 как из матрицы a, так и из b (поскольку c [1,0] = 0,5 и c [1,1] = 0,5).

Третья строка r является третьей строкой b, потому что c [2,0] равно 0, а c [2,1] равно 1, поэтому мы просто рассмотрим третью строку матрицы b.

Example

Как я могу сделать это в Python (желательно с функцией numpy)?

1 Ответ

2 голосов
/ 14 октября 2019

Мы можем использовать np.einsum -

In [57]: A # 3D input array
Out[57]: 
array([[[0.2, 0. , 0.8],
        [0. , 0. , 1. ],
        [0. , 0.2, 0.8]],

       [[1. , 0. , 0. ],
        [0. , 0.2, 0.8],
        [0.2, 0. , 0.8]]])

In [58]: c # 2D weight array
Out[58]: 
array([[1. , 0. ],
       [0.5, 0.5],
       [0. , 1. ]])

In [59]: np.einsum('ijk,ji->jk',A,c)
Out[59]: 
array([[0.2, 0. , 0.8],
       [0. , 0.1, 0.9],
       [0.2, 0. , 0.8]])

Альтернативно с np.matmul -

In [142]: (np.matmul(A.transpose(1,2,0),c[...,None]))[...,0]
Out[142]: 
array([[0.2, 0. , 0.8],
       [0. , 0.1, 0.9],
       [0.2, 0. , 0.8]])

Примечание: на Python 3.x np.matmulможно заменить на @ operator.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...