Комплексное руководство по Джулии

Углубленный взгляд на структуры данных в Julia

Краткое введение в структуры данных на языке программирования Julia.

Видео для этой статьи:

Репозиторий Github

"Ноутбук"

Введение

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

Типы данных - это основа компьютерного программирования. Любая работа по программированию будет включать в себя манипулирование, перемещение и работу с основными типами данных. Сами типы, созданные на языке, являются просто контейнерами для других типов, которые обычно являются типами данных.

Основные типы данных

Первый тип данных, которые мы можем хранить внутри языка программирования Julia, - это базовый тип данных. Основные типы данных включают такие данные, как числа, текст, символы и логические значения.

Логический

Логический или логический тип - это тип, который указывает, истинно ли условие. Логические значения могут быть представлены как истинным / ложным значением, которое в конечном итоге превращается в 1 или 0, так и просто целым числом (1 или 0), которое представляет условие типа.

typeof(true)
Bool

Точно так же мы также можем утверждать логические значения для целых чисел, представляющих истину или ложь на языке Julia:

Bool(1)
true

Целые числа

Целочисленный тип данных в программировании аналогичен целочисленному типу данных в математике. Целое число - это целое число без дробной части. Обычно всякий раз, когда мы работаем с целыми числами в Julia, мы будем работать с типом данных Int64. Это означает, что целое число имеет 64 бита. В качестве альтернативы есть также Int32s и BigInts.

typeof(5)
Int64

Поплавки

Поплавки - это целые числа со вторым числом после десятичной точки или дробное значение. Числа с плавающей запятой можно рассматривать как две отдельные части данных: целое число перед дробным значением и дробное значение после целого числа.

typeof(5.5)
Float64

Сложный и большой

В языке Julia довольно часто используются сложные поплавки. Сложное число с плавающей запятой - это просто число с плавающей запятой, имеющее как мнимые, так и реальные значения. Важно отметить, что это означает, что эти типы не настоящие. Часто для научных вычислений требуется реальный тип данных, в результате вам может потребоваться присвоить некоторые комплексы значениям с плавающей запятой.

typeof(5.5 + 5.5im)
Complex(Float64)

«Im» во второй части этого типа данных означает, что предшествующие числа мнимые.

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

# Big Int
big(51515235151351335)
# Big Float
big(5.4172473471347374147)

Символ

Тип данных symbol - еще одна замечательная вещь, которую язык Julia извлек из функциональной парадигмы. Символы могут использоваться для представления всего, от параметров до ключей словаря - и они достаточно хороши в своей работе. В общем, тип данных symbol - отличная вещь для языка программирования, потому что его можно использовать как представление практически для всего, отсюда и название: Symbol. Символы могут быть написаны на языке Julia, просто поставив двоеточие перед ключевым словом, например:

typeof(:Symbol)
Symbol

Строки и символы

Строки - это довольно простая концепция, чтобы обернуть голову вокруг - строка представляет собой набор последовательных символов unicode / ascii, которые составляют композицию символов. Как показано в части 3 - Циклы, строки можно перебирать в цикле, чтобы выявить следующий тип данных - символы. Если вы еще не прочитали часть 3, вы можете проверить ее здесь:



Строки разделяются кавычками. С другой стороны, символы ограничиваются апострофами.

typeof("Hello")
String
typeof('h')
char

Поплавки используются для представления символов в ASCII. В результате мы всегда можем разделить символы активов на числа с плавающей запятой:

float('5')

Интересный факт: вот как работает LabelEncoding

Структуры данных

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

Массивы

element_wise = [5, 10, 15, 15]

Этот новый массив представляет собой массив, содержащий 4 Int64. Мы можем проиндексировать их числами в зависимости от их позиции в массиве:

element_wise[1] == 5
true
element_wise[2] == 10
true

Мы также можем увидеть это в виде:

typeof(element_wise)
Array{Int64, 1}

Почему скобки важны:

Вы могли заметить, что всякий раз, когда создается массив, он обычно находится в квадратных скобках. Без этих скобок типом этой коллекции данных был бы Кортеж. Хотя я не вдавался в подробности о кортежах, это вполне допустимый тип данных, но, конечно, не то, что вам нужно, если вам нужен массив.

h = 5,10,15,20
typeof(h)
NTuple{4, Int64}

Кроме того, отсутствие скобок может сделать невозможным понимание функции, какие параметры соответствуют какой переменной. Рассмотрим метод append! (). Приложение! Метод принимает два параметра: во-первых, данные, которые вы хотите добавить, а во-вторых, данные, которые вы хотите добавить к нему. Это работает, если мы использовали скобки, поскольку массив рассматривается как один аргумент. Однако использование запятой приведет к ошибке ArgumentError.

         parameters
           v    v
append!([5,10], 15)
      parameters
       v  v  v
append!(5,10,15)

Словари

В Julia словари должны быть явно определены как таковые, иначе он вернет кортеж. Это очень ценный и динамичный тип, который дополнительно иллюстрируется при работе с наборами данных или данными JSON.

data = Dict(:A => [5,10,15], :B => [11, 12, 13)

Используя словарь, мы можем вызывать данные, вызывая соответствующие символьные ключи, в этом примере:

data[:A]
[5, 10, 15]

Пары

Пары на самом деле являются типами кортежей, но важно понимать, что пара - это кортеж, а кортеж - это не пара. Пара - это то же самое, что мы использовали для доступа к частям нашего словаря секунду назад, и ее можно создать таким же образом:

key = :A => [5,10,15]

Набор

Наборы - это просто уникальные значения, извлеченные из типа. Например, если бы мы утверждали установленный тип в массиве, мы бы получили каждое из уникальных значений в этом массиве:

arr = [5, 5, 7, 7, 6, 4, 5]
set = Set(arr)
println(set)
[5, 7, 6, 4]

Кортежи

Кортежи - это обобщенные структуры для типов данных, которые не обязательно имеют определенную структуру. Кортежи можно рассматривать как менее организованный массив.

h = 5, 10, 15

Создание типов

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

struct typer
    h
    v
end

С этим типом мы теперь можем присвоить ему новую переменную, предоставив необходимые данные в качестве параметров для конструктора:

w = typer(5, 10)

В этом случае struct typer - это наш новый тип, который содержит данные h и v. Мы можем получить доступ к этим данным, вызвав struct.data:

typer.h
5
typer.v
10

Мы также можем передать этот новый тип через функцию, например, добавив наши данные h и v из нашей структуры типов:

function addtyper(typer)
    return(typer.h + typer.v)
end

Важно отметить, что данные в сконструированных типах на языке Julia будут неизменными. Это можно изменить, поместив ключевое слово mutable перед типом:

mutable struct typer
    h
    v
end

Вывод

Типы данных всегда являются очень важной вещью в программировании, и эта проблема еще более остро ощущается в мире науки о данных. Большая часть программирования просто использует структуры данных и сконструированные типы для работы с типами данных. При этом понимание типов данных очень важно для программиста. В Джулии много типов, и некоторые из них вы можете сконструировать самостоятельно, но умение использовать и управлять этими типами станет ключом к тому, чтобы стать отличным программистом.