Как изменить форму матрицы в Mathematica

При работе с матрицами часто бывает удобно изменить их форму. Например, чтобы превратить матрицу размера N x M в вектор длины N X M. В MATLAB существует функция reshape:

RESHAPE(X,M,N) возвращает матрицу размером M на N, элементы которой берутся по столбцам из X. Ошибка возникает, если X не имеет элементов M*N.

В случае преобразования между матрицей и вектором я могу использовать функцию Mathematica Flatten, которая использует представление Mathematica в виде вложенного списка для матриц. В качестве быстрого примера предположим, что у меня есть матрица X:

матрица 4x4

С помощью Flatten[X] я могу получить вектор {1,2,3,...,16}. Но что было бы гораздо полезнее, так это применение reshape(X,2,8) в Matlab, что привело бы к следующей матрице:

матрица 4x4

Это позволило бы создавать произвольные матрицы до тех пор, пока размеры равны N*M. Насколько я могу судить, нет ничего встроенного, что заставило бы меня задуматься, не написал ли кто-нибудь собственную функцию Reshape.


person speciousfool    schedule 18.03.2010    source источник


Ответы (4)


ArrayReshape делает именно это.

person Matthias Odisio    schedule 09.07.2013
comment
обратите внимание, что это не было доступно, когда был задан вопрос, но, вероятно, это лучший ответ сегодня.. (новое в версии 9) - person agentp; 10.07.2013
comment
@ Джордж да; это в духе сайта продвигать адаптивные ответы! - person Matthias Odisio; 10.07.2013

Reshape[list_, dimensions_] := 
First[Fold[Partition[#1, #2] &, Flatten[list], Reverse[dimensions]]]

Пример использования:

In: Reshape[{1,2,3,4,5,6},{2,3}]

Out: {{1,2,3},{4,5,6}}

Это работает с массивами произвольной глубины.

person Bob Jones    schedule 04.05.2012

Я знаю, что это старая ветка, но ради архивов и поиска в Google у меня есть более общий способ, позволяющий преобразовать список длины m*n*... в массив m*n*... :

Reshape[list_, shape__] := Module[{i = 1},
  NestWhile[Partition[#, shape[[i]]] &, list, ++i <= Length[shape] &]
  ]

Eg:

In:= Reshape[Range[8], {2, 2, 2}]

Out:= {{{1, 2}, {3, 4}}, {{5, 6}, {7, 8}}}
person Quantum_Oli    schedule 05.04.2012
comment
Примечание. Это решение переставляет последние два измерения, поэтому оно не совсем работает. - person Guillochon; 11.06.2012

Также появилась новая функция ArrayReshape[].

Пример:

{{1, 2, 3}, {4, 5, 6}} // MatrixForm

ArrayReshape[{{1, 2, 3}, {4, 5, 6}}, {3, 2}] // MatrixForm
person Putnik11    schedule 10.09.2017
comment
как изменить форму по столбцу? т. е. элементы опускаются вертикально вниз, а затем переходят в следующий столбец? - person Chen Stats Yu; 31.10.2017