Документация Engee
Notebook

Перестановки в массивах и изменения их формы

Многие функции Engee используют элементы массива и придают им другую форму или последовательность. Это может быть полезно для предварительной обработки данных, для последующих вычислений или анализа данных.

Изменение формы

Функция reshape изменяет размер и форму массива. Например, преобразуйте матрицу размером 3 $\times$ 4 в матрицу размером 2 $\times$ 6.

In [ ]:
A = [1 4 7 10; 2 5 8 11; 3 6 9 12]
Out[0]:
3×4 Matrix{Int64}:
 1  4  7  10
 2  5  8  11
 3  6  9  12
In [ ]:
B = reshape(A,2,6)
Out[0]:
2×6 Matrix{Int64}:
 1  3  5  7   9  11
 2  4  6  8  10  12

Используя элементы из A можно создать многомерный массив, который будет содержать 3 матрицы размером 2 $\times$ 2.

In [ ]:
C = reshape(A,2,2,3)
Out[0]:
2×2×3 Array{Int64, 3}:
[:, :, 1] =
 1  3
 2  4

[:, :, 2] =
 5  7
 6  8

[:, :, 3] =
  9  11
 10  12

Транспонирование и переворачивание

Обычной задачей в линейной алгебре является работа с транспонированием матрицы, которая превращает строки в столбцы, а столбцы - в строки. Для этого используйте функцию transpose или оператор ' .

In [ ]:
A = rand(3, 3)
Out[0]:
3×3 Matrix{Float64}:
 0.671146  0.15141   0.445067
 0.205738  0.600742  0.832939
 0.992871  0.645874  0.623041
In [ ]:
A'
Out[0]:
3×3 adjoint(::Matrix{Float64}) with eltype Float64:
 0.671146  0.205738  0.992871
 0.15141   0.600742  0.645874
 0.445067  0.832939  0.623041
In [ ]:
B = [1+im 1-im; -im im]
Out[0]:
2×2 Matrix{Complex{Int64}}:
 1+1im  1-1im
 0-1im  0+1im
In [ ]:
transpose(B)
Out[0]:
2×2 transpose(::Matrix{Complex{Int64}}) with eltype Complex{Int64}:
 1+1im  0-1im
 1-1im  0+1im

Функция reverse перемещает строки вверх-вниз и столбцы слева направо в зависимости от значения ключевого слова dims.

dims = 1    # Работа со строками
dims = 2    # Работа со столбцами
In [ ]:
A = [1 2; 3 4]
Out[0]:
2×2 Matrix{Int64}:
 1  2
 3  4
In [ ]:
B = reverse(A, dims=1)
Out[0]:
2×2 Matrix{Int64}:
 3  4
 1  2
In [ ]:
С = reverse(A, dims=2)
Out[0]:
2×2 Matrix{Int64}:
 2  1
 4  3

Смещение и поворот

Вы можете сдвинуть элементы массива на определенное количество позиций с помощью функции circshift. Например, создайте матрицу размером 3 $\times$ 4 и сдвиньте ее столбцы вправо на 2. Второй аргумент [0 2] сообщает circshift, что нужно сдвинуть строки на 0 мест и столбцы на 2 места вправо.

In [ ]:
A = [1 2 3 4; 5 6 7 8; 9 10 11 12]
Out[0]:
3×4 Matrix{Int64}:
 1   2   3   4
 5   6   7   8
 9  10  11  12
In [ ]:
B = circshift(A,[0 2])
Out[0]:
3×4 Matrix{Int64}:
  3   4  1   2
  7   8  5   6
 11  12  9  10

Чтобы сдвинуть строки из A вверх на 1 и сохранить столбцы на месте, укажите второй аргумент как [-1 0].

In [ ]:
C = circshift(A,[-1 0])
Out[0]:
3×4 Matrix{Int64}:
 5   6   7   8
 9  10  11  12
 1   2   3   4
In [ ]:
A = [1 2; 3 4]
Out[0]:
2×2 Matrix{Int64}:
 1  2
 3  4

Сортировка

Сортировка данных в массиве также является ценным инструментом. Например, функция sort сортирует элементы каждой строки или столбца матрицы отдельно в порядке возрастания или убывания. Значниее ключевого слова dims сообщает со строками или столбцами идет работа.

Создайте матрицу A и отсортируйте каждый столбец из A в порядке возрастания.

In [ ]:
A = rand(4,4)
Out[0]:
4×4 Matrix{Float64}:
 0.461938  0.0393388  0.227309  0.0815622
 0.278592  0.850108   0.563387  0.646155
 0.385563  0.42562    0.851425  0.859178
 0.655341  0.601584   0.659288  0.238689
In [ ]:
B = sort(A, dims=1)
Out[0]:
4×4 Matrix{Float64}:
 0.278592  0.0393388  0.227309  0.0815622
 0.385563  0.42562    0.563387  0.238689
 0.461938  0.601584   0.659288  0.646155
 0.655341  0.850108   0.851425  0.859178

Еcли указать значение ключевого слова rev = true, то сортировка будет не в порядке возрастания, а в порядке убывания.

In [ ]:
C = sort(A, dims=2, rev=true)
Out[0]:
4×4 Matrix{Float64}:
 0.461938  0.227309  0.0815622  0.0393388
 0.850108  0.646155  0.563387   0.278592
 0.859178  0.851425  0.42562    0.385563
 0.659288  0.655341  0.601584   0.238689

Вывод

В данном материале мы рассмотрели некоторые функции для преобразования матриц: изменение формы, траспонирование, смещение и поворот, а также сортировку. Больше информации по операциям над матрицами вы можете найти в разделе Линейная алгебра.