Объединить две матрицы несколько раз указанным c способом - PullRequest
2 голосов
/ 14 апреля 2020

Предположим, у нас есть две квадратные матрицы "x" и "y" размерности nxn и числовая c переменная "a". Я хочу объединить эти матрицы несколько раз в зависимости от параметра «а», чтобы получить большую квадратную матрицу «ху». Эта новая матрица будет содержать только копии первых двух матриц, расположенных следующим образом: матрица "x" на главной диагонали новой матрицы "xy" и матрица "y" во всех других элементах матрицы "xy".

Вот несколько примеров для уточнения вопроса:

вход: две матрицы 2x2

x=np.array([[1,1],[1,1]])
y=np.array([[2,2],[2,2]])

для a=2 ожидаемый результат:

xy=np.array([[1,1,2,2],
            [1,1,2,2],
            [2,2,1,1],
            [2,2,1,1]])

для a=3 ожидаемый результат:

xy=np.array([[1,1,2,2,2,2],
            [1,1,2,2,2,2],
            [2,2,1,1,2,2],
            [2,2,1,1,2,2],
            [2,2,2,2,1,1],
            [2,2,2,2,1,1]])`

я ищу код для общего случая c с a=n

1 Ответ

2 голосов
/ 14 апреля 2020

Один из возможных способов сделать это может быть.

Учитывая x, y и коэффициент сцепления a, сначала создайте диагональ блока матрицу X из a блоков x, затем возьмите все ненулевой индекс X_idx этого, т.е. индекс диагональных элементов блока. Здесь я полагаю, что ваш x не содержит нулевых компонентов.

Теперь создайте матрицу Y, которая представляет собой плитку формы (a,a) y блоки. Наконец, давайте сделаем диагональные блоки равными нулю Y, применив к нему маску X_idx, и суммируем X и Y, чтобы получить желаемую матрицу XY. Из этого следует:

import numpy as np
from scipy.linalg import block_diag

x = np.array([[1,1],[1,1]])
y = np.array([[2,2],[2,2]])    
a = 3

X =  block_diag(*[x]*a)
X_idx = np.nonzero(X)
Y = np.tile(y,(a,a))
Y[X_idx] = 0
XY = X + Y

, который выводит соответствующие XY

>>> array([[1, 1, 2, 2, 2, 2],
           [1, 1, 2, 2, 2, 2],
           [2, 2, 1, 1, 2, 2],
           [2, 2, 1, 1, 2, 2],
           [2, 2, 2, 2, 1, 1],
           [2, 2, 2, 2, 1, 1]])

Если x имеет нулевые значения, просто замените np.nonzero call на:

X_idx = (np.repeat(np.arange(a*x.shape[0]),x.shape[0]),
         np.r_[[np.tile(np.arange(i,i+x.shape[0]),x.shape[0]) for i in range(0,a*x.shape[0],x.shape[0])]].ravel())
...