Создание матрицы (массива), где каждый элемент сам по себе является матрицей

У меня четыре матрицы mxn. Из этих матриц я хочу создать матрицу mxn матриц, чтобы каждый элемент новой матрицы был матрицей 2x2, принимающей соответствующие элементы из каждой матрицы. Пока я могу подумать о том, чтобы сложить все четыре матрицы, а затем изменить форму каждого элемента по оси z и заменить его. Я считаю, что есть более элегантное решение. Пример ввода:

$$
\begin{bmatrix}
A_{11} & A_{12}\\ 
A_{21} & A_{22}
\end{bmatrix}
,

\begin{bmatrix}
B_{11} & B_{12}\\ 
B_{21} & B_{22}
\end{bmatrix}
,

\begin{bmatrix}
C_{11} & C_{12}\\ 
C_{21} & C_{22}
\end{bmatrix}
,

\begin{bmatrix}
D_{11} & D_{12}\\ 
D_{21} & D_{22}
\end{bmatrix}
$$

Ожидаемый результат:

$$
\begin{bmatrix}
\begin{bmatrix}
A_{11} & B_{11}\\ 
C_{11} & D_{11}
\end{bmatrix} & \begin{bmatrix}
A_{12} & B_{12}\\ 
C_{12} & D_{12}
\end{bmatrix}\\ 
\begin{bmatrix}
A_{21} & B_{21}\\ 
C_{21} & D_{21}
\end{bmatrix} & \begin{bmatrix}
A_{22} & B_{12}\\ 
C_{22} & D_{22}
\end{bmatrix}
\end{bmatrix
$$

Это просто списки списков или вы используете какой-то фреймворк поверх Python, например NumPy или Pandas?

Patrick Haugh 09.08.2018 21:37

Все являются массивом Numpy

tachyon 09.08.2018 21:39

Было бы действительно полезно показать некоторые образцы входных матриц, а также желаемую выходную матрицу.

rahlf23 09.08.2018 21:41

Пожалуйста, предоставьте образец. Непонятно, из каких элементов вашей матрицы mxn следует построить матрицу 2x2.

WurzelseppQX 09.08.2018 21:45
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
223
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Поскольку все они имеют mxn элементов, сделайте mxn итераций и на каждой итерации создайте матрицу 2x2 из каждого элемента из 4 матриц, а затем добавьте список к вашей окончательной матрице mxn.

matrix1 = [[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]
matrix2 = [[2, 2, 2, 2], [2, 2, 2, 2], [2, 2, 2, 2]]
matrix3 = [[3, 3, 3, 3], [3, 3, 3, 3], [3, 3, 3, 3]]
matrix4 = [[4, 4, 4, 4], [4, 4, 4, 4], [4, 4, 4, 4]]

matrixFinal = []

for i in range(len(matrix1)):
    matrixFinal.append([])
    for j in range(len(matrix1[i])):
        matrixFinal[i].append ([[matrix1[i][j], matrix2[i][j]], [matrix3[i][j], matrix4[i][j]]])

print(matrixFinal)

Я мог бы это сделать, но думаю, что потребуется время, чтобы перебрать все элементы. Я ожидал более элегантного решения, если оно есть. В любом случае, спасибо

tachyon 09.08.2018 22:03

Вам нужно знать каждый элемент в каждой матрице, вы должны сделать 4xmxn итераций, но в остальном я только что поделился своей идеей. Если вы не думаете, что это отвечает на ваш вопрос, я могу удалить его.

Notrius 09.08.2018 22:09

Нет, это нормально. Мне просто интересно, есть ли другой эффективный способ сделать это.

tachyon 09.08.2018 22:13
Ответ принят как подходящий

Пример функции создания:

In [510]: def foo(astr,m,n):
     ...:     alist = [astr+'%d%d'%(i,j) for i in range(m) for j in range(n)]
     ...:     return np.array(alist).reshape(m,n)
In [511]: foo('A',2,2)
Out[511]: 
array([['A00', 'A01'],
       ['A10', 'A11']], dtype='<U3')

Список из 4 таких массивов:

In [512]: alist = [foo('A',2,2),foo('B',2,2),foo('C',2,2),foo('D',2,2)]

Различные способы штабелирования:

In [513]: np.stack(alist)
Out[513]: 
array([[['A00', 'A01'],
        ['A10', 'A11']],

       [['B00', 'B01'],
        ['B10', 'B11']],

       [['C00', 'C01'],
        ['C10', 'C11']],

       [['D00', 'D01'],
        ['D10', 'D11']]], dtype='<U3')

In [514]: np.stack(alist,2)
Out[514]: 
array([[['A00', 'B00', 'C00', 'D00'],
        ['A01', 'B01', 'C01', 'D01']],

       [['A10', 'B10', 'C10', 'D10'],
        ['A11', 'B11', 'C11', 'D11']]], dtype='<U3')
In [515]: _.shape
Out[515]: (2, 2, 4)

Его можно изменить по-разному:

In [516]: __.reshape(2,2,2,2)
Out[516]: 
array([[[['A00', 'B00'],
         ['C00', 'D00']],

        [['A01', 'B01'],
         ['C01', 'D01']]],


       [[['A10', 'B10'],
         ['C10', 'D10']],

        [['A11', 'B11'],
         ['C11', 'D11']]]], dtype='<U3')
In [517]: _.reshape(4,2,2)
Out[517]: 
array([[['A00', 'B00'],
        ['C00', 'D00']],

       [['A01', 'B01'],
        ['C01', 'D01']],

       [['A10', 'B10'],
        ['C10', 'D10']],

       [['A11', 'B11'],
        ['C11', 'D11']]], dtype='<U3')

Вместо другой оси вы можете создать одну и перенести оси на свое усмотрение.

Другие вопросы по теме