Массивы

В Julia есть много способов инициализации массивов. Базовый способ создания нового массива - с помощью метода Array

Array{Float64, 2}(undef, 2, 3)   # Matrix 2x3 with undefined values

В данном случае, метод Array создает массив, тип элементов Float64, размерность 2, значения Undefined, размер 2х3.

Более простой способ создания массивов разных размерностей:

[1 2; 3 4]    # Matrix 2x2
[1 2 3 4]     # Matrix 1x4
[1, 2, 3, 4]  # Vector 4-elements

Пробел обозначает разделение элементов в одной строке. ; - разделение строк

Обратите внимание, что [1 2 3 4] - задает Матрицу, размерности 2, размера 1х4, а [1, 2, 3, 4] - задает Вектор, длины 4.

Стандартные методы работы с массивами

zeros(n, m) - создает матрицу, размерностит n x m, заполненную нулями. Можно также указать тип в качесве первого аргумента: zeros(Int8, 2, 3).

ones(n, m) - создает матрицу, размерности n х m, заполненную единицами. Можно также указать тип в качесве первого аргумента: ones(Int8, 2, 3).

trues(n, m) / falses(n, m) - создает матрицу, размерности n x m, заполненную битовыми единицами или нулями.

fill(x, (n, m)) - заполняет массив n x m значениями x

rand(n) - создает вектор, размера n, заполненный случайными числами

rand(k:j, n) - создает вектор, размера n, заполненный числами от k до j

rand(n, m) - создает матрицу, размера n x m, заполненную случайными числами

collect(range) - создает вектор из диапазона range.

push!(A, x) - добавляет элемент x в конец массива A (! - означает, что функция меняет значение своих аргументов)

pushfirst!(A, x) - добавляет элемент x в начало массива A (! - означает, что функция меняет значение своих аргументов)

insert!(A, n, x) - вставка значения x в вектор A на позицию n

pop!(A) - удаление последнего элемента массива

popfirst!(A) - удаление первого элемента массива

deleteat!(A, pos) - удаление элемента массива A на позиции pos

A = A[end:-1:1] - реверс массива A

x in A - проверка наличия элемента x в массиве A

length(A) - длина массива

maximum(A) / minimum(A) - максимальное / минимальное число в массиве A

B = vec(A) - преобразование массива в вертикальный вектор

transpose(A) - транспонирование массива

A * B - перемножение матриц

sum(A) - суммирование элементов. Можно также использовать столбцы или строки: sum(A, dims=1), sum(A, dims=2)

Интересные примеры

['a':1:'z';]    #26-element Vector of "a" to "z"
10.0 .^ (-3:3)  #Vector 0.001, 0.01, 0.1, 1.0, 10.0, 100.0, 1000.0

Конкатенация в массивах

collect(0:2:10) == [0:2:10;]   #true

В данном случае точка с запятой ; - это вертикальная конкатенация каждого элемента диапазона

[1:2, 4:5]       #no concatenation, 2-element Vector: 1:2, 4:5
[1:2; 4:5]       #concatenation, 4-element Vector: 1, 2, 4, 5
[1:2 4:5]        #Matrix 2x2 of two vertical vectors
[[[1,2]  [4,5]]  #Same matrix 2x2 as in previous example
[1; 2; 3; 4]     #Vector of 4-elements
[1;; 2;; 3;; 4]  #Matrix 1x4
[[1 1]; 2 3; [4 4]]  #Matrix 3x2, same as [1 1; 2 3; 4 4]

Общий синтаксис конкатенации

[A; B; C; ...] - вертикальная конкатенация vcat

vcat(A, B) - объединение двух массивов по вертикали, если они имеют одинаковое количество столбцов. С помощью vcat можно добавлять строки в матрицу. Тоже самое, что [A; B].

[A B C ...] - горизонтальная конкатенация hcat

hcat(A, B) - объединение двух массивов по горизонтали, если они имеют одинаковое количество строк. С помощью hcat можно добавлять столбцы в матрицу. Тоже самое, что [A B].

[A B; C D; ...] - горизонтально-вертикальная конкатенация hvcat

Подробнее про конкатенацию см. по ссылке.

Генераторы (comprehensions)

Julia поддерживает синтаксис генераторов, очень похоже на другие языка, например Python

A = [0 for i in 1:10] - вектор с 10 нулевыми элементами

A = [x * y for x in 1:10 for y in 1:2] - вектор с 20 элементами

[x + y for x in [1, 2, 3], y in [4, 5, 6, 7]]  #Matrix 3x3

В данном примере x - вектор [1, 2, 3] повторяется вертикально 4 раза суммируя каждый элемент со значением y. Обратите внимание на разницу - внутри стоит стоит запятая, которая указывает, что это матрица.

Подробнее про генераторы в Julia смотрите по ссылке.

Выборка slice

A[n, m] - выбрать элемент в n-строке и в m-столбце

a[i:k:j] - выборка диапазона элементов от i-го до j-го с шагом k из вектора a

A[i1:k1:j1, i2:k2:j2] - выборка элементов из мартицы A

A[:,:] - выборка всех элементов матрицы A

Векторизация

В Julia довольно легко делать операции над элементами векторов и матриц. Для этого удобно использовать оператор векторизации . которы применяет функцию на каждый элемент массива.

A .* 2 - умножение каждого элемента массива на 2

log.(A) - натуральный логарифм от каждого элемента массива

A .+ B - поэлементное сложение двух матриц

A[A .< 0] .= 0   # set to zero all elements less than 0

Подробнее про векторизацию в Julia смотрите по ссылке.

Пересечение массивов

union(A, B, C, ...) - объединяет только уникальные элементы массивов

intersect(A, B) - пересечение элементов в массиве

setdiff(A, B) - неповторяющиеся элементы массивов

unique(A) - уникальные элементы массива. Возвращает Тип множество - Set.

Last updated