Вот подход -
def matrix_combination(A,B):
N = A.shape[0]//3 # Size of each block
A4D = A.reshape(3,N,3,N)
B4D = B.reshape(3,N,3,N)
r,c = np.nonzero(~np.eye(3,dtype=bool))
out = np.zeros((6,N,6,N),dtype=A.dtype)
idx0 = 2*np.arange(3)
out[idx0[r],:,idx0[c]] = A4D[r,:,c]
out[idx0[r]+1,:,idx0[c]+1] = A4D[r,:,c]
out[idx0[r],:,idx0[c]+1] = B4D[r,:,c]
out[idx0[r]+1,:,idx0[c]] = B4D[r,:,c]
out = out.reshape(N*6,-1)
np.fill_diagonal(out,1)
return out
Пример запуска -
In [41]: A
Out[41]:
array([[ 0, 0, 44, 98, 40, 69],
[ 0, 0, 22, 55, 51, 19],
[16, 58, 0, 0, 95, 95],
[90, 88, 0, 0, 47, 91],
[65, 96, 21, 50, 0, 0],
[15, 91, 23, 91, 0, 0]])
In [42]: B
Out[42]:
array([[ 0, 0, 20, 36, 85, 15],
[ 0, 0, 17, 78, 56, 55],
[86, 19, 0, 0, 60, 96],
[76, 30, 0, 0, 34, 36],
[73, 63, 28, 58, 0, 0],
[40, 19, 22, 96, 0, 0]])
In [43]: matrix_combination(A,B)
Out[43]:
array([[ 1, 0, 0, 0, 44, 98, 20, 36, 40, 69, 85, 15],
[ 0, 1, 0, 0, 22, 55, 17, 78, 51, 19, 56, 55],
[ 0, 0, 1, 0, 20, 36, 44, 98, 85, 15, 40, 69],
[ 0, 0, 0, 1, 17, 78, 22, 55, 56, 55, 51, 19],
[16, 58, 86, 19, 1, 0, 0, 0, 95, 95, 60, 96],
[90, 88, 76, 30, 0, 1, 0, 0, 47, 91, 34, 36],
[86, 19, 16, 58, 0, 0, 1, 0, 60, 96, 95, 95],
[76, 30, 90, 88, 0, 0, 0, 1, 34, 36, 47, 91],
[65, 96, 73, 63, 21, 50, 28, 58, 1, 0, 0, 0],
[15, 91, 40, 19, 23, 91, 22, 96, 0, 1, 0, 0],
[73, 63, 65, 96, 28, 58, 21, 50, 0, 0, 1, 0],
[40, 19, 15, 91, 22, 96, 23, 91, 0, 0, 0, 1]])
Итак, с A и B как '(N, N)' все равно будет каждый элемент '3 x 3'? – Divakar
Каждый A и B является тензором 3x3. Это называется тензором по блокам, где каждый элемент является другим тензором. – NunodeSousa
Итак, было бы 3 x 3 = 9 блоков в каждом A и B всегда? – Divakar