Массивы. Функции работы с массивами
Массивы. Функции работы с массивами
Массив (Array) — это набор данных одного и того же типа. Массивы могут быть разной размерности. Одномерный — просто набор чисел, двумерный — таблица с этими числами и т.п. На каждую размерность в массиве может приходиться максимум 2 31 -1 элементов. Можно создать массив из данных следующих типов: numeric, Boolean, path, string, waveform, и cluster. Нельзя создать массив из массивов, однако можно сделать cluster (о кластерах будет подробно рассказано в следующих разделах). Элементы в массиве упорядочены, каждый из них имеет номер (index). Номера начинаются с нуля, как и положено.
Создание Array Controls и Indicators
Чтобы создать регулятор или индикатор массива, выберите «Array» в палитре Controls>>All Controls>>Array & Cluster и поместите его на лицевую панель. Затем перетащите внутрь рамки массива какой-нибудь уже имеющийся регулятор или индикатор нужного вам типа данных. Все, готово.
|
Примерно вот так выглядит массив (array) на лицевой панели. 1 — это индекс массива, 2 — элементы этого массива. Чтобы изменить размерность массива, щелкните на индексе и выберите в контекстном меню «Add Dimension». Как уже говорилось, двумерный массив — это таблица. Чтобы массив был более наглядным, можно растянуть область элементов до нужного вам размера:
|
Помните, что размерность массива и количество элементов в нем не определяются видом массива на лицевой панели (например, у того же двумерного массива можно сделать зону элементов состоящей только из одно видимого). Так же, можно добавить на блок-диаграмму массив-константу (это может быть полезно, например, для передачи данных в SubVI). Для этого нужно в палитре unctions>>All Functions>>Array выбрать «array constant» и поместить ее на поле диаграммы, а затем перетащить внутрь рамки константу нужного типа.
Функции для работы с массивами
Рассмотрим основные функции, которые используются при работе с массивами в LabVIEW. Все эти функции находятся в палитре Functions>>All Functions>>Array.
Array Size — — возвращает число элементов в массиве. Если массив многомерный, то результатом выполнения функции будет массив, число элементов в котором равно размерности. Например, результатом применения этой функции к следующему одномерному массиву [1,6,5,3,4] будет число 5.
Initialize Array — — создает массив нужной размерности с нужным числом элементов в каждой размерности и заполняет его значениями, определяемыми терминалом element. Чтобы добавить измерение, нужно «растянуть» кубик функции.
Array Subset — — возвращает часть массива (подмассив элементов), начиная с некого (определяется терминалом index) и длиной, определяемой терминалом length. Например, если применить эту функцию к массиву [1,6,5,3,4] с аргументами index=1 и length=2, результатом будет массив [6,5]
Build Array — — с помощью этой функции можно добавить элементы в массив, или построить из нескольких массивов массив большей размерности. Кубик можно растягивать. Для того, чтобы при соединении двух массивов получить массив той же размерности, нужно щелкнуть правой кнопкой мыши на функции и в контекстном меню выбрать «Concatenate Inputs».
Index Array — — возвращает элемент или подмассив массива с указанным номером (index). Пример: для нашего массива [1,6,5,3,4] эта функция с аргументом 2 вернет число 5.
Полиморфизм, наследование и инкапсуляция. Что-то из ООП:) Функции, которые находятся в палитрах Functions>>Express Numeric и Functions>>All Functions>>Numeric — полиморфные. Это означает, что на вход этим функциям можно подавать данные разных типов, в том числе не только скалярные — но и массивы. Например, функцию add можно использовать для сложения массива и скаляра, или двух массивов. Пример: при сложении массива [1,3,2] и числа 2 получится массив [3,5,4]. При сложении двух массивов [1,3,2] и [3,5,4] получится массив [4,8,6]. Если в двух массивах разное число элементов, то в результате сложения получится массив, число элементов в котором равно числу элементов в самом маленьком из двух массивов. Например, при сложение массива [3,1,2,3] с массивом [1,2,1] получим в результате [4,3,3].
Учебный модуль для работы с массивами
В PascalABC.NET, как и в Delphi, имеются как статические, так и динамические массивы. Разумеется, использовать при обучении оба вида массивов — непозволительная роскошь. И было принято решение: основной акцент при изучении массивов в курсе «Основы программирования» сделать именно на динамические массивы.
Почему? По ряду причин.
- Они меняют свой размер по ходу работы программы.
- Они легко передаются в подпрограммы и помнят свой размер.
- В стандартных .NET-библиотеках содержится достаточно большое количество подпрограмм для работы с динамическими массивами.
Недостаток видится только один — нетрадиционность такого подхода при обучении на Паскале. Ну что ж, будем ломать стереотипы. Во всех современных языках массивы уже давно — динамические.
Со времени последней статьи о массивах в PascalABC.NET произошел ряд изменений. Во-первых, появились двумерные динамические массивы, которые описываются следующим образом:
Инициализируются такие массивы либо с помощью операции new:
Цикл по такому массиву осуществляется следующим образом:
- Создание одномерных и двумерных массивов с одновременным заполнениием их случайными значениями.
- Заполнение заданным значением и случайными значениями уже созданных динамических массивов.
- Ввод, вывод.
- Простейшая сортировка.
Заметим, что модуль лишь облегчает выполнение часто встречающихся операций, но не содержит подпрограмм решения учебных задач типа вставки, удаления, сдвига элементов и пр.
Рассмотрим несколько примеров его использования.
Пример 1. Создание случайного одномерного массива и его сортировка.
Здесь функция CreateRandomIntegerArray выделяет память из 10 элементов под динамический массив и заполняет его случайными значениями в диапазоне от 0 до 99, процедура WritelnArray выводит массив на экран, разделяя данные пробелами и процедура Sort сортирует массив по возрастанию.
Приведем этот же пример с небольшими вариациями.
Пример 1a.
Здесь используется автоопределение типа при инициализирующем присваивании, массив заполняется случайными числами в диапазоне от 1 до 9, затем его элементы выводятся, разделяясь запятыми, затем он сортируется по убыванию.
Трудно было удержаться и от введения методов расширений, позволяющих добавлять новые методы ко всем массивам. В модуле Arrays реализованы лишь методы расширения для вывода массивов — заполнение и сортировка осуществляется только внешними подпрограммами. Приведем код примера 1 с методами расширения:
Пример 1б.
Наконец, рассмотрим пример заполнения и вывода двумерного динамического массива. Чтобы были понятны типы, опишем его явно.
Пример 2.
Здесь создается матрица 4 на 5, заполняется случайными вещественным значениями (по умолчанию от 0 до 10) и выводится на экран, при этом количество знаков после десятичной точки равно 2.
Это практически все возможности небольшого модуля Arrays, облегчающего выполнение рутинных операций с динамическими массивами.
NumPy, часть 1: начало работы
NumPy — это библиотека языка Python, добавляющая поддержку больших многомерных массивов и матриц, вместе с большой библиотекой высокоуровневых (и очень быстрых) математических функций для операций с этими массивами.
Установка NumPy
На linux — пакет python3-numpy (или аналогичный для вашей системы), или через pip. Ну или же собирать из исходников https://sourceforge.net/projects/numpy/files/NumPy/.
На Windows на том же сайте есть exe установщики. Или, если возникают проблемы, рекомендую ещё хороший сборник библиотек http://www.lfd.uci.edu/
Начинаем работу
Основным объектом NumPy является однородный многомерный массив (в numpy называется numpy.ndarray). Это многомерный массив элементов (обычно чисел), одного типа.
Наиболее важные атрибуты объектов ndarray:
ndarray.ndim — число измерений (чаще их называют «оси») массива.
ndarray.shape — размеры массива, его форма. Это кортеж натуральных чисел, показывающий длину массива по каждой оси. Для матрицы из n строк и m столбов, shape будет (n,m). Число элементов кортежа shape равно ndim.
ndarray.size — количество элементов массива. Очевидно, равно произведению всех элементов атрибута shape.
ndarray.dtype — объект, описывающий тип элементов массива. Можно определить dtype, используя стандартные типы данных Python. NumPy здесь предоставляет целый букет возможностей, как встроенных, например: bool_, character, int8, int16, int32, int64, float8, float16, float32, float64, complex64, object_, так и возможность определить собственные типы данных, в том числе и составные.
ndarray.itemsize — размер каждого элемента массива в байтах.
ndarray.data — буфер, содержащий фактические элементы массива. Обычно не нужно использовать этот атрибут, так как обращаться к элементам массива проще всего с помощью индексов.
Создание массивов
В NumPy существует много способов создать массив. Один из наиболее простых — создать массив из обычных списков или кортежей Python, используя функцию numpy.array() (запомните: array — функция, создающая объект типа ndarray):
Функция array() трансформирует вложенные последовательности в многомерные массивы. Тип элементов массива зависит от типа элементов исходной последовательности (но можно и переопределить его в момент создания).
Можно также переопределить тип в момент создания:
Функция array() не единственная функция для создания массивов. Обычно элементы массива вначале неизвестны, а массив, в котором они будут храниться, уже нужен. Поэтому имеется несколько функций для того, чтобы создавать массивы с каким-то исходным содержимым (по умолчанию тип создаваемого массива — float64).
Функция zeros() создает массив из нулей, а функция ones() — массив из единиц. Обе функции принимают кортеж с размерами, и аргумент dtype:
Функция eye() создаёт единичную матрицу (двумерный массив)
Функция empty() создает массив без его заполнения. Исходное содержимое случайно и зависит от состояния памяти на момент создания массива (то есть от того мусора, что в ней хранится):
Для создания последовательностей чисел, в NumPy имеется функция arange(), аналогичная встроенной в Python range(), только вместо списков она возвращает массивы, и принимает не только целые значения:
Вообще, при использовании arange() с аргументами типа float, сложно быть уверенным в том, сколько элементов будет получено (из-за ограничения точности чисел с плавающей запятой). Поэтому, в таких случаях обычно лучше использовать функцию linspace(), которая вместо шага в качестве одного из аргументов принимает число, равное количеству нужных элементов:
fromfunction(): применяет функцию ко всем комбинациям индексов
Печать массивов
Если массив слишком большой, чтобы его печатать, NumPy автоматически скрывает центральную часть массива и выводит только его уголки.
Если вам действительно нужно увидеть весь массив, используйте функцию numpy.set_printoptions:
И вообще, с помощью этой функции можно настроить печать массивов «под себя». Функция numpy.set_printoptions принимает несколько аргументов:
precision : количество отображаемых цифр после запятой (по умолчанию 8).
threshold : количество элементов в массиве, вызывающее обрезание элементов (по умолчанию 1000).
edgeitems : количество элементов в начале и в конце каждой размерности массива (по умолчанию 3).
linewidth : количество символов в строке, после которых осуществляется перенос (по умолчанию 75).
suppress : если True, не печатает маленькие значения в scientific notation (по умолчанию False).
nanstr : строковое представление NaN (по умолчанию ‘nan’).
infstr : строковое представление inf (по умолчанию ‘inf’).
formatter : позволяет более тонко управлять печатью массивов. Здесь я его рассматривать не буду, можете почитать здесь (на английском).
И вообще, пользуйтесь официальной документацией по numpy, а в этом пособии я постараюсь описать всё необходимое. В следующей части мы рассмотрим базовые операции над массивами.
Основные функции для работы с массивами на PHP, префикс array
17.07.18 PHP 1430
Работать с массивами приходится в любом языке программирования, в PHP существует ряд специальных функций для удобной работы с массивами. Массивы позволяют хранить большое количество информации, это сложные структуры, которые могут содержать различные данные.
В PHP существует несколько видом массивов. Массивы могут быть простыми, могут быть ассоциативными, в которых есть соответствия ключа со значением. Также массивы могут быть вложенными, в один массив можно легко вложить другой.
Название большинства функций для работы с массивами начинается на array_, это позволяет быстро применить нужную функцию. Например, в IDE или в каком-либо редакторе может поддерживаться автодополнение, в таком случае разработчику достаточно написать array_ и дальше будут предложены все функции для работы с массивами. Но есть и функции, названия которых нужно запомнить или смотреть справочник. Такие функции начинаются без префикса array_.
Посмотрим, какие есть основные функции в PHP для работы с массивами:
- array_flip — меняет местами ключи с их значениями в массиве,
- array_intersect — вычисляет схождение массивов,
- array_keys — возвращает все или некоторое подмножество ключей массива,
- array_merge — сливает один или большее количество массивов,
- array_pop — извлекает последний элемент массива,
- array_push — добавляет один или несколько элементов в конец массива,
- array_rand — выбирает один или несколько случайных ключей из массива,
- array_reverse — возвращает массив с элементами в обратном порядке,
- array_search — осуществляет поиск данного значения в массиве и возвращает ключ первого найденного элемента в случае удачи,
- array_shift — извлекает первый элемент массива,
- array_slice — выбирает срез массива,
- array — создает массив,
- asort — сортирует массив, сохраняя ключи,
- count — подсчитывает количество элементов массива или что-то в объекте,
- current — возвращает текущий элемент массива,
- end — устанавливает внутренний указатель массива на его последний элемент,
- in_array — проверяет, присутствует ли в массиве значение,
- key — выбирает ключ из массива,
- reset — устанавливает внутренний указатель массива на его первый элемент.
Таким образом, работать с массивами в PHP достаточно просто, достаточно запомнить несколько простых функций и применять их для достижения нужного результата.