Вариант №1 - просто вставляем значения исходной матрицы в заданные позиции шаблона:
>>> matrix = np.array([[1, 2], [3, 4]])
>>> new_matrix = np.zeros((6, 6), dtype=matrix.dtype)
>>> new_matrix[1::3, 1::3] = matrix
>>> new_matrix
array([[0, 0, 0, 0, 0, 0],
[0, 1, 0, 0, 2, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 3, 0, 0, 4, 0],
[0, 0, 0, 0, 0, 0]])
Вариант №2 - с полноценными преобразованиями:
>>> matrix = np.array([[1, 2], [3, 4]])
>>> matrix = matrix.reshape(1, 1, -1)
>>> matrix = np.pad(matrix, ((1, 1), (1, 1), (0, 0)), 'constant', constant_values=0)
>>> matrix = matrix.transpose(2, 0, 1).reshape(2, 2, 3, 3)
>>> matrix = np.hstack(np.hstack(matrix))
>>> matrix
array([[0, 0, 0, 0, 0, 0],
[0, 1, 0, 0, 2, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 3, 0, 0, 4, 0],
[0, 0, 0, 0, 0, 0]])
Подозреваю, что можно уменьшить число действий, обойтись без np.stack() и эффективно применить np.lib.stride_tricks.as_strided(), но это лютый мозговынос.