Массив в "Питоне" (Python)
Python - высокоуровневый язык программирования общего назначения. Поддерживает не только ООП, но и также структурное, функциональное, императивное, аспектно-ориентированное программирование. Стандартная библиотека содержит многие инструменты для работы с сетевыми протоколами, текстовыми кодировками, мультимедийными форматами, для разработки кроссплатформенных приложений.
Массив в "Питоне"
Одномерный массив представляет собой список элементов.
Значения списка указываются между квадратных скобок [], перечисляются через запятую. Любой элемент вызывается по индексу. Элементам могут присваиваться новые значения.
Так выглядит пустой список:
- a = []
Массив строк в "Питоне" выглядит так:
- Prime = ['string1', 'string2', 'string3']
- Prime[1] = 'string2'; //true
Функция len() возвращает количество элементов внутри списка.
- len(Prime) == 4; // true
Для перечисления элементов массива используется цикл for. Его отличие от Pascal в том, что он перебирает именно элементы, а не их индексы.
- for elem in [1, 4, 67]
Для создания цикла используется генератор заполнения списков. Записывается в виде [значение массива for имя переменной in количество элементов];
Двумерный массив в "Питоне" создается с помощью вложенных генераторов. Выглядеть это должно примерно следующим образом:
- [[0 for j in range(m)] for i in range(n)]
Создание массива в NumPy
Для создания и модификации массивов в "Питоне" используется библиотека NumPy.
Она поддерживает многомерный массив и матрицы, обладает большим набором пакетов для решения математических задач. А также обеспечивает работу с однородными многомерными массивами и матрицами. Чтобы получить возможность пользоваться функциями этого пакета, его необходимо импортировать.
- import numpy as np
Один из наиболее простых способов, как задать массив в "Питоне" - воспользоваться функцией array(). Она создает объект типа ndarray.
- array = np.array(/* множество элементов */)
Теперь array обладает типом ndarray. Это можно проверить функцией array.type(). Она приняла в качестве аргумента имя созданного массива. Вернется ответ - <class 'numpy.ndarray'>.
Чтобы переопределить тип, нужно использовать dtype=np.complex на этапе создания.
- array2 = np.array([ /*элементы*/, dtype=np.complex)
Если нужно задать массив, но его элементы на этом этапе неизвестны, он заполняется нулями функцией zeros(). Можно создать массив из единиц функцией ones(). В качестве аргументов принимается количество вложенных массивов и количество элементов внутри.
- np.zeros(2, 2, 2)
Создаст два массива внутри, которые содержат по 2 элемента.
- array([
- [[0, 0]]
- [[0, 0]]]
- )
Чтобы вывести массив на экран, используется функция print(). Если массив слишком большой для печати, NumPy скрывает центральную часть и выводит только крайние значения.
Чтобы увидеть весь массив, применяется функция set_printoptions(). По умолчанию выводятся только первые 1000 элементов. Это значение указывается как аргумент с ключевым словом threshold.
Базовые операции NumPy
Любые действия над элементами массива в "Питоне" предполагают создание нового массива.
Созданный массив содержит элементы, полученные в результате выполнения некоторых действий над ними. Массивы могут взаимодействовать только в том случае, когда имеют одинаковый размер. Например:
- array1 = np.array([[1, 2, 3], [1, 2, 3]])
- array2 = np.array([[1, 2, 3], [1, 2, 3], [1, 2, 3]])
При выполнении array1 + array2 компилятор выведет ошибку, потому что размер первого массива - 2, а второго - 3.
- array1 = np.array([1, 2, 5, 7])
- array2 = arange([1, 5, 1])
Array1 + array2 вернет массив с элементами 2, 4, 8, 11. Ошибка не возникнет, потому что размер обоих одинаковый.
Вместо ручного сложения можно использовать функцию, которая входит в класс ndarray sum().
- np.array(array1 + array1) == array1 + array2
Класс ndarray предоставляет большую библиотеку методов для математических операций. Они задаются в виде np.имя метода (имя переменной).
Форма
Размер массива в "Питоне" определяет форму. Для проверки текущей формы используется метод shape().
Массив с двумя и тремя элементами имеет форму (2, 2, 3). Она изменится, если в shape() указать аргументы. В качестве первого будет использовано количество подмассивов, второго - размерность каждого подмассива. Ту же самую операцию выполняет функция reshape(). Ее параметры определяют число строк и столбцов.
Существуют методы для манипуляций формой. Например, ravel() из многомерного массива делает одномерный, выстраивая внутренние значения по возрастанию последовательно. Функция transpose() меняет местами строки и столбцы многомерного массива.
Срезы
Часто приходится работать не с целым массивом, а только с некоторыми его элементами. Для этих целей в "Пайтоне" существует метод "Срез" (слайс). Он пришел на замену перебору элементов циклом for.
Метод открывает широкие возможности для получения копии массива в "Питоне". Все манипуляции осуществляются в таком виде [start:stop:step]. Здесь значение start обозначает индекс элемента, от которого начинается отсчет, значение stop - последний элемент, размер шага - количество пропускаемых элементов при каждой итерации. По умолчанию start равняется нулю, то есть отсчет начинается от нулевого элемента списка, stop равняется индексу последнего элемента в списке, шаг - равен единице, то есть перебирает каждый поочередно. Если передать в функцию без аргументов, список копируется полностью от начала до конца.
Например, у нас есть массив:
- mas = [1, 2, 3, 4]
Чтобы его скопировать, используем mas[:]. Функция вернет последовательность элементов [1, 2, 3, 4]. Если аргументом будет отрицательное значение, например -3, функция вернет элементы с индексами от третьего до последнего.
- mas[-3]; //[4]
После двойного двоеточия указывается шаг элементов, копируемых в массиве. Например, mas[::2] вернет массив [1, 3]. Если указано отрицательное значение, например, [::-2] отсчет будет начинаться с конца, и получим [3, 1].
Методом среза можно гибко работать с вложенными списками. Для двумерного массива в "Питоне" [:, 2] означает, что вернется каждый третий элемент всех массивов. Если указать [:2] - вернутся первые два.
Копия
Получение копии осуществляется при помощи слайсов, о которых написано выше. В Python копирование через присваивание не работает, потому что таким образом передаются не сами объекты, а только ссылки. Это означает, что создав массив со значениями np.arange(10) и присвоив array2 = array1, получим два объекта с одинаковыми значениями, но разными именами, в данном случае array1 и array2. Изменение формы одного из них повлияет на второй. Функция array1.shape(3, 4) изменит форму array2.
- array1.shape() == (3, 4);//true
- array2.shape() == (3, 4);//true
Функция view() создает разные объекты с одинаковыми данными. Например, у нас есть некий массив array, к которому мы применяем функцию view()
- array.view()
Полученное значение присваиваем второму массиву array2 и видим, что это разные объекты, но у них одинаковые данные. Проверяем:
- array2 is array1; //false
Если меняем форму одного из массивов, оно не меняется и во втором.
- array1.shape(2, 6)
- array1 == array2; // true
Объединение, разбиение
Массивы между собой могут объединяться. Это осуществляется вдоль осей или строк. Функция hstack() объединяет их по строкам, а vstack() - по столбцам.
С помощью функции column_stack() можно объединить массивы в аргументах в один одномерный. Аналогично column_stack() работает row_stack(), но объединяет строки, а не столбцы. Чтобы разбить массив по горизонтали, применяется функция hsplit(), а vsplit() - по вертикали.