Один из возможных способов сделать это может быть.
Учитывая 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())