NumPy, часть 1: начало работы

NumPy — это библиотека языка Python, добавляющая поддержку больших многомерных массивов и матриц, вместе с большой библиотекой высокоуровневых (и очень быстрых) математических функций для операций с этими массивами.
Установка NumPy
На linux — пакет python3-numpy (или аналогичный для вашей системы), или через pip. Ну или же собирать из исходников https://sourceforge.net/projects/numpy/files/NumPy/.
На Windows на том же сайте есть exe установщики. Или, если возникают проблемы, рекомендую ещё хороший сборник библиотек http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy.
Начинаем работу
Основным объектом 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, а в этом пособии я постараюсь описать всё необходимое. В следующей части мы рассмотрим базовые операции над массивами.
Подписывайтесь, чтобы не пропустить 🙂
Для вставки кода на Python в комментарий заключайте его в теги
Массивы
Большинство программ работает не с отдельными переменными, а с набором переменных. Например, программа может обрабатывать информацию об учащихся класса, считывая список учащихся с клавиатуры или из файла, при этом изменение количества учащихся в классе не должно требовать модификации исходного кода программы.
Раньше мы сталкивались с задачей обработки элементов последовательности, например, вычисляя наибольший элемент последовательности. Но при этом мы не сохраняли всю последовательность в памяти компьютера, однако, во многих задачах нужно именно сохранять всю последовательность, например, если бы нам требовалось вывести все элементы последовательности в возрастающем порядке (“отсортировать последовательность”).
Для хранения таких данных можно использовать структуру данных, называемую в Питоне список (в большинстве же языков программирования используется другой термин “массив”). Список представляет собой последовательность элементов, пронумерованных от 0, как символы в строке. Список можно задать перечислением элементов списка в квадратных скобках, например, список можно задать так:
Primes = [2, 3, 5, 7, 11, 13]
Rainbow = ['Red', 'Orange', 'Yellow', 'Green', 'Blue', 'Indigo', 'Violet']
В списке Primes — 6 элементов, а именно, Primes[0] == 2, Primes[1] == 3, Primes[2] == 5, Primes[3] == 7, Primes[4] == 11, Primes[5] == 13. Список Rainbow состоит из 7 элементов, каждый из которых является строкой.
Также как и символы строки, элементы списка можно индексировать отрицательными числами с конца, например, Primes[-1] == 13, Primes[-6] == 2.
Длину списка, то есть количество элементов в нем, можно узнать при помощи функции len, например, len(A) == 6.
Рассмотрим несколько способов создания и считывания списков. Прежде всего можно создать пустой список (не содержащий элементов, длины 0), в конец списка можно добавлять элементы при помощи метода append. Например, если программа получает на вход количество элементов в списке n, а потом n элементов списка по одному в отдельной строке, то организовать считывание списка можно так:
A = []
for i in range(int(input()):
A.append(int(input())
В этом примере создается пустой список, далее считывается количество элементов в списке, затем по одному считываются элементы списка и добавляются в его конец.
Для списков целиком определены следующие операции: конкатенация списков (добавление одного списка в конец другого) и повторение списков (умножение списка на число). Например:
A = [1, 2, 3]
B = [4, 5]
C = A + B
D = B * 3
В результате список C будет равен [1, 2, 3, 4, 5], а список D будет равен [4, 5, 4, 5, 4, 5]. Это позволяет по-другому организовать процесс считывания списков: сначала считать размер списка и создать список из нужного числа элементов, затем организовать цикл по переменной i начиная с числа 0 и внутри цикла считывается i-й элемент списка:
A = [0] * int(input())
for i in range(len(A)):
A[i] = int(input())
Вывести элементы списка A можно одной инструкцией print(A), при этом будут выведены квадратные скобки вокруг элементов списка и запятые между элементами списка. Такой вывод неудобен, чаще требуется просто вывести все элементы списка в одну строку или по одному элементу в строке. Приведем два примера, также отличающиеся организацией цикла:
for i in range(len(A)):
print(A[i])
Здесь в цикле меняется индекс элемента i, затем выводится элемент списка с индексом i.
for elem in A:
print(elem, end = ' ')
В этом примере элементы списка выводятся в одну строку, разделенные пробелом, при этом в цикле меняется не индекс элемента списка, а само значение переменной (например, в цикле for elem in ['red', 'green', 'blue'] переменная elem будет последовательно принимать значения 'red', 'green', 'blue'.
Массивы
Массив (англ. array) - структура данных, хранящая набор значений. Каждое значение из набора индексируется, т.е. значения имеют номера (индексы).
Простейший массив имеет следующий интерфейс
- создать(A, N) -> массив A длины N - создание массива A размера N .
- записать(A, i, x) - записывает значение x в i -ый элемент массива A .
- считать(A, i) -> элемент массива A с индексом i - взятие элемента по индексу (чтение).
- удалить(A) - удаление массива А .
Обычно индексами массива являются целые положительные числа, причём в непрерывном диапазоне. Например, 0, 1, 2. N-2, N-1 , где N - размер массива. В таком случае массив упорядочен по индексу и можно говорить, что массив также является последовательностью.
Для массива операции чтения и записи выполняются за O(1) , т.е. время этих операций не зависит от количества элементов в массиве.
Массив в Python
Массив в Python
упорядоченная изменяемая последовательность. массив хранит множество элементов, которые образуют последовательность. При этом можно изменять как сами элементы массива, так и сам массив: пополнять массив новыми элементами или удалять их. . объектов произвольных типов элементами массива являются Python-объекты. При этом допускается, чтобы в одном массиве хранились объекты разных типов.
Массивы в Python также называют списками или листами (англ. list). Терминология в других языках программирования, а также в теории алгоритмов может быть другая.
Список Python является гибким в использовании объектом. Как инструмент, программист может использовать списки, например, для создания элементов линейной алгебры: точек, векторов, матриц, тензоров. Или, например, для таблицы с некоторыми данными.
Важно заметить, что , питоновский список, является универсальной структурой данных. В том числе, ей можно пользоваться как массивом (что мы и будем делать)! То есть, у этого объекта есть интерфейс, описанный в предыдущем разделе, причём с теми же асимптотиками, хотя возможности выходят гораздо за пределы простейшего массива.
Создание массива
Литерал массива
Массив можно создать при помощи литералов. Литерал - это код, который используется для создания объекта "вручную" (задания константы). Например, некоторые литералы уже изученных ранее объектов:
- int : 5 , -23
- float : 5. , 5.0 , -10.81 , -1.081e1
- str : 'ABCdef' , "ABCdef"
В случае массива литералом являются квадратные скобки [] , внутри которых через запятую , перечисляются элементы массива:
>>> [] [] >>> [0, 1, 2, 3, 4] [0, 1, 2, 3, 4] >>> ['sapere', 'aude'] ['sapere', 'aude'] >>> ['Gravitational acceleration', 9.80665, 'm s^-2'] ['Gravitational acceleration', 9.80665, 'm s^-2'] >>> type([0, 1, 2, 3, 4])
Создание массива заданной длины, склеивание массивов
Чтобы создать массив наперёд заданной длины, нужно задать инициализируещее значение и длину. Ниже создаётся массив, содержащий 10 нулей.
>>> A = [0] * 10 >>> A [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] >>> type(A)
С похожим синтаксисом мы сталкивались при работе со строками. Массивы в Python можно "склеивать" с помощью знака сложения:
>>> A = [0] * 3 # [0, 0, 0] >>> B = [1] * 3 # [1, 1, 1] >>> C = [2] * 3 # [2, 2, 2] >>> D = A + B + C >>> D [0, 0, 0, 1, 1, 1, 2, 2, 2]
На самом деле, умножение массива на целое число M это создание нового массива путём M "склеиваний" исходного массива с самим собой:
>>> [0, 1] * 3 [0, 1, 0, 1, 0, 1] >>> [0, 1] + [0, 1] + [0, 1] [0, 1, 0, 1, 0, 1]
Элементы массива: доступ и изменение
Выше мы убедились, что массив это множество объектов различных типов, теперь убедимся, что это упорядоченная последовательность изменяемых объектов.
Доступ по индексу
Для доступа к элементам массива используется операция взятия элемента по индексу. Для этого рядом с литералом или переменной массива необходимо подписать индекс элемента в квадратных скобках:
>>> ['Gravitational acceleration', 9.80665, 'm s^-2'][0] 'Gravitational acceleration' >>> ['Gravitational acceleration', 9.80665, 'm s^-2'][1] 9.80665 >>> ['Gravitational acceleration', 9.80665, 'm s^-2'][2] 'm s^-2' >>> l = [10, 20, 30] >>> l[0] 10 >>> l[1] 20 >>> l[2] 30
Нумерация элементов массива начинается с нуля.
При запросе элемента по несуществующему индексу, Python вызовет ошибку IndexError:
>>> l [10, 20, 30] >>> l[3] Traceback (most recent call last): File "", line 1, in IndexError: list index out of range
Поэтому всегда нужно быть уверенным, что индексация не выходит за пределы длины массива. Получить её можно с помощью функции len() :
>>> l [10, 20, 30] >>> len(l) 3 >>> l[len(l) - 1] 30
Последняя конструкция встречается нередко, поэтому в Python существует возможность взять элемент по отрицательному индексу:
>>> l [10, 20, 30] >>> l[-1] 30 >>> l[-2] 20 >>> l[-3] 10 >>> l[-4] Traceback (most recent call last): File "", line 1, in IndexError: list index out of range
Таким образом для индекса n ≥ 0, l[-n] эвивалентно l[len(l) - n] .
Изменение элементов
Изменение элементов осуществляется с помощью присваивания:
>>> l = [10, 20, 30] >>> l [10, 20, 30] >>> l[0] = 0 >>> l [0, 20, 30] >>> l[2] = 55 >>> l [0, 20, 55]
Доступ в цикле while
>>> l [0, 20, 55] >>> i = 0 >>> while i len(l): . print(i, l[i]) . i += 1 . 0 0 1 20 2 55 >>>
Доступ в цикле for
Наиболее универсальный способ это использование генератора range:
>>> l [0, 20, 55] >>> for i in range(len(l)): . print(i, l[i]) . 0 0 1 20 2 55
Печать массива
Чтобы распечатать элементы массива в столбец, воспользуйтесь циклом for , как в разделе выше.
Если нужно распечатать массив в строку, то воспользуйтесь функцией print :
>>> A = [0, 1, 2, 3] >>> print(*A) 0 1 2 3
Здесь знак * это операция развёртывания коллекции по аргументам функции. Функция print принимает на вход сколько угодно аргументов и действие выше эквиваленто следующему:
>>> print(A[0], A[1], A[2], A[3]) 0 1 2 3
Ремарка о строках
На самом деле, мы уже ранее сталкивались с массивами в предудыщих лабораторных, когда использовали строковый метод str.split :
>>> s = "ab cd ef1 2 301" >>> s.split() ['ab', 'cd', 'ef1', '2', '301']
Т.е. str.split , по умолчанию, разбивает строку по символам пустого пространства (пробел, табуляция) и создаёт массив из получившихся "слов".
Загляните в help(str.split) , чтобы узнать, как изменить такое поведение, и разбивать строку, например, по запятым, что является стандартом для представления таблиц в файлах csv (comma separated values).
Методом, являющимся обратным к операции str.split является str.join . Он "собирает" строку из массива строк:
>>> s 'ab cd ef1 2 301' >>> l = s.split() >>> l ['ab', 'cd', 'ef1', '2', '301'] >>> l[-1] = '430' >>> l ['ab', 'cd', 'ef1', '2', '430'] >>> ','.join(l) 'ab,cd,ef1,2,430' >>> ' -- '.join(l) 'ab -- cd -- ef1 -- 2 -- 430'
Работа с двумерными массивами
Как вам рассказали, в массиве мы можем хранить различные данные. В том числе в ячейке массива можем хранить другой массив. Давайте предположим, что в каждой ячейке массива размера N у нас будет храниться другой массив размера M . Таким образом мы можем построить таблицу или матрицу размера N x M .
Создание двумерного массива (матрицы) размера N x M в питоне:
a = [] for _ in range(n): a.append([0] * m)
a = [[0] * m for _ in range(n)]
Обращение к элементами двумерного массива:
a[i][j] = 5
Массив в Python
В этой статье мы разберем, что такое массив в Python и как его использовать. Вы узнаете, как определять массивы и какие методы обычно используются для выполнения различных операций над ними.
Важно отметить, что в данной статье рассматриваются массивы, которые можно создать путем импорта модуля array . Массивы NumPy мы здесь рассматривать не будем.
Итак, мы разберем следующие темы:
- Введение в массивы
- Основные различия между списками и массивами
- Когда нужно использовать массивы
- Как использовать массив в Python
- Определение массива
- Поиск длины массива
- Индексация массива
- Поиск элементов в массиве
- Использование циклов с массивами
- Срезы массивов
- Методы массивов для выполнения различных операций
- Изменение существующего значения
- Добавление нового значения
- Удаление значения
- Заключение
Что ж, давайте приступать!
Что такое массив в Python?
Массив — это фундаментальная структура данных и важная часть большинства языков программирования. В Python массивы — это контейнеры, способные хранить более одного элемента одновременно.
В частности, они представляют собой упорядоченный набор элементов, каждое значение которого относится к одному и тому же типу данных. Это самое важное, что нужно помнить о массивах в Python. Они могут содержать последовательность нескольких элементов только одного типа.
В чем разница между списками и массивами в Python?
Списки — одна из наиболее распространенных структур данных в Python и основная часть языка.
Списки и массивы ведут себя сходным образом.
Как и массивы, списки представляют собой упорядоченную последовательность элементов.
Они также изменяемы и не имеют фиксированного размера, то есть могут увеличиваться и уменьшаться на протяжении всей жизни программы. Элементы можно добавлять и удалять, что делает списки очень гибкими в работе.
Однако списки и массивы — это не одно и то же.
В списках могут храниться элементы различных типов данных. Это означает, что список может одновременно содержать целые числа, числа с плавающей запятой, строки или любой другой тип данных Python. С массивами это не сработает.
Как уже упоминалось, массивы хранят элементы только какого-то одного типа данных. Это важно помнить! Есть массивы целых чисел, массивы чисел с плавающей запятой и т.д.
Когда следует использовать массивы в Python
Списки встроены по умолчанию в язык программирования Python, а массивы — нет. Поэтому, если вы хотите использовать массивы, их сперва нужно импортировать через модуль array .
Массивы модуля array представляют собой тонкую обертку массивов в C. Они полезны, когда вам нужно работать с однородными данными.
Они также более компактны и занимают меньше памяти и места, что делает их более эффективными по сравнению со списками.
Если вы хотите выполнять математические вычисления, лучше воспользоваться массивами NumPy, импортировав модуль NumPy.
Стоит отметить, что использовать массивы в Python следует только тогда, когда вам это действительно нужно, ведь списки работают аналогичным образом и более гибки в работе.
Как использовать массивы в Python
Чтобы создавать массивы в Python, вам сначала нужно импортировать модуль array , который содержит все необходимые для работы функции.
Импортировать модуль массива можно тремя способами:
1. Использовать import array в верхней части файла. Это позволит нам подключить модуль array . После чего мы сможем создать массив, используя array.array() .
import array # Создание массива array.array()
2. Чтобы не вводить постоянно array.array() , можно прописать import array as arr в верхней части файла вместо просто import array . После чего для создания массива нужно будет набрать arr.array() . Arr действует как псевдоним, после которого сразу следует конструктор для создания массива.
import array as arr # Создание массива arr.array()
3. Наконец, вы также можете использовать from array import * , где с помощью * импортируются все доступные функции данного модуля. В таком случае, чтобы создать массив, нужно написать просто array() .
from array import * # Создание массива array()
Как определить массив в Python
После того, как вы импортировали модуль array, вы можете перейти к непосредственному созданию массива Python.
Общий синтаксис создания массива выглядит следующим образом:
variable_name = array(typecode,[elements])
Давайте разберем синтаксис подробнее:
- variable_name будет именем массива
- typecode указывает, какие элементы будут храниться в массиве. Это может быть массив целых чисел, массив чисел с плавающей запятой или массив любого другого типа данных в Python. Но помните, что все элементы должны быть одного типа данных.
- Внутри квадратных скобок вы указываете элементы, которые будут храниться в массиве, при этом каждый элемент отделяется запятой. Вы также можете создать пустой массив, просто написав variable_name = array(typecode) без каких-либо элементов.
Ниже приведена таблица кодов для различных типов данных.
| TYPECODE | Тип в C | Тип в Python | Размер |
|---|---|---|---|
| ‘b’ | signed char | int | 1 |
| ‘B’ | unsigned char | int | 1 |
| ‘u’ | wchar_t | Unicode character | 2 |
| ‘h’ | signed short | int | 2 |
| ‘H’ | unsigned short | int | 2 |
| ‘i’ | signed int | int | 2 |
| ‘I’ | unsigned int | int | 2 |
| ‘l’ | signed long | int | 4 |
| ‘L’ | unsigned long | int | 4 |
| ‘q’ | signed long long | int | 8 |
| ‘Q’ | unsigned long long | int | 8 |
| ‘f’ | float | float | 4 |
| ‘d’ | double | float | 8 |
Создание массива на практике
Вот пример того, как можно определить массив в Python:
import array as arr numbers = arr.array('i',[10,20,30]) print(numbers) #output #array('i', [10, 20, 30])
Давайте разберем, что мы только что сделали.
Сначала мы подключили модуль array , в данном случае с помощью import array as arr .
Затем мы создали массив чисел.
Мы использовали arr.array() , так как arr это наш псевдоним для модуля.
Внутри конструктора array() мы сначала указали i для целых чисел. Это означает, что массив может включать как положительные, так и отрицательные значения. Если бы мы, например, указали H , это бы означало, что отрицательные значения не допускаются.
Наконец, мы перечислили значения, которые будут храниться в массиве, в квадратных скобках.
Имейте в виду, что если вы попытаетесь включить значения, тип которых не соответствует коду i , то есть не целочисленные значения, вы получите сообщение об ошибке:
import array as arr numbers = arr.array('i',[10.0,20,30]) print(numbers) #output #Traceback (most recent call last): # File "/Users/dionysialemonaki/python_articles/demo.py", line 14, in # numbers = arr.array('i',[10.0,20,30]) #TypeError: 'float' object cannot be interpreted as an integer
В этом примере мы попытались включить в массив число с плавающей запятой. И получили ошибку, потому что это целочисленный массив.
Другой способ создания массива:
from array import * # Массив чисел с плавающей запятой numbers = array('d',[10.0,20.0,30.0]) print(numbers) #output #array('d', [10.0, 20.0, 30.0])
В этом примере модуль массива был импортирован через from array import * . Затем был создан массив чисел с типом данных float . Это означает, что он содержит только числа с плавающей запятой, которым соответствует код d .
Как найти длину массива в Python
Чтобы узнать точное количество элементов, содержащихся в массиве, можно использовать встроенный метод len() .
Он вернет вам целое число, равное общему количеству элементов в указанном вами массиве.
import array as arr numbers = arr.array('i',[10,20,30]) print(len(numbers)) #output # 3
В этом примере массив содержал три элемента — 10 , 20 , 30 . Поэтому длина массива равна 3.
Индексация массива и доступ к отдельным элементам
Каждый элемент массива имеет определенный адрес. Доступ к отдельным элементам осуществляется путем ссылки на их порядковый номер.
Индексация в Python, как и во всех языках программирования, и вычислениях в целом начинается с 0, а не с 1. Об этом важно помнить.
Чтобы получить доступ к элементу, вы сначала пишете имя массива, за которым следуют квадратные скобки. Внутри квадратных скобок вы указываете индекс нужного элемента.
Общий синтаксис будет выглядеть так:
array_name[index_value_of_item]
Вот так можно получить доступ к каждому отдельному элементу в массиве:
import array as arr numbers = arr.array('i',[10,20,30]) print(numbers[0]) # Получение 1-го элемента print(numbers[1]) # Получение 2-го элемента print(numbers[2]) # Получение 3-го элемента #output #10 #20 #30
Помните, что значение индекса последнего элемента массива всегда на единицу меньше, чем длина массива. Если n — длина массива, то значением индекса последнего элемента будет n-1 .
Обратите внимание, что вы также можете получить доступ к каждому отдельному элементу, используя отрицательную индексацию.
При отрицательной индексации последний элемент будет иметь индекс -1, предпоследний элемент — -2 и так далее.
К примеру, получить каждый элемент массива можно следующим образом:
import array as arr numbers = arr.array('i',[10,20,30]) print(numbers[-1]) # Получение последнего элемента print(numbers[-2]) # Получение предпоследнего элемента print(numbers[-3]) # Получение первого элемента #output #30 #20 #10
Как искать элемент в массиве в Python
Вы можете узнать порядковый номер элемента с помощью метода index() .
В качестве аргумента метода вы передаете значение искомого элемента, и вам возвращается его индекс.
import array as arr numbers = arr.array('i',[10,20,30]) # Поиск индекса элемента со значением 10 print(numbers.index(10)) #output #0
Если имеется более одного элемента с указанным значением, будет возвращен индекс элемента, который встречается первым. К примеру, это может выглядеть так:
import array as arr numbers = arr.array('i',[10,20,30,10,20,30]) # Поиск индекса элемента со значением 10 # Возвращается индекс первого из двух элементов со значением 10 print(numbers.index(10)) #output #0
Как перебрать массив в Python с помощью цикла
Мы рассмотрели, как получить доступ к каждому отдельному элементу массива и распечатать элементы по отдельности.
Вы также видели, как распечатать массив с помощью метода print() . Этот метод дает следующий результат:
import array as arr numbers = arr.array('i',[10,20,30]) print(numbers) #output #array('i', [10, 20, 30])
Но что делать, если вы хотите вывести значения одно за другим?
Здесь на помощь приходит цикл. Вы можете идти по массиву и распечатывать значения одно за другим с каждой новой итерацией цикла. Подробнее о циклах в Python можно почитать в статье «Pythonic циклы».
К примеру, для решения нашей задачи вы можете использовать простой цикл for :
import array as arr numbers = arr.array('i',[10,20,30]) for number in numbers: print(number) #output #10 #20 #30
Вы также можете использовать функцию range() и передать метод len() в качестве ее параметра. Это даст тот же результат:
import array as arr values = arr.array('i',[10,20,30]) # Распечатка всех значений массива по отдельности for value in range(len(values)): print(values[value]) #output #10 #20 #30
Как использовать срезы с массивами в Python
Чтобы получить доступ к определенному диапазону значений внутри массива, используйте оператор среза (двоеточие : ).
Если, используя срез, вы укажете только одно значение, отсчет по умолчанию начнется с 0. Код получает первый элемент (с индексом 0) и идет до элемента с указанным вами индексом, но не захватывает его.
import array as arr # Исходный массив numbers = arr.array('i',[10,20,30]) # Получение только значений 10 и 20 print(numbers[:2]) # С первой по вторую позицию (индексы 0 и 1) #output #array('i', [10, 20])
Когда вы передаете два числа в качестве аргументов, вы указываете диапазон индексов. В этом случае отсчет начинается с первого указанного вами индекса и идет до второго, не включая его:
import array as arr # Исходный массив numbers = arr.array('i',[10,20,30]) # Получение только значений 20 и 30 print(numbers[1:3]) # Со второй по третью позицию #output #array('i', [20, 30])
Методы выполнения операций с массивами в Python
Массивы изменчивы, это означает, что мы можем менять их элементы самым разным образом. Можно изменить значение элементов, добавить новые или удалить те, которые вам больше не нужны в вашей программе.
Давайте рассмотрим несколько методов, наиболее часто используемых для выполнения операций с массивами.
Изменение значения элемента в массиве
Вы можете изменить значение определенного элемента, указав его позицию (индекс) и присвоив ему новое значение. Сделать это можно так:
import array as arr #original array numbers = arr.array('i',[10,20,30]) # Изменение первого элемента # Меняется значение с 10 на 40 numbers[0] = 40 print(numbers) #output #array('i', [40, 20, 30])
Добавление нового значения в массив
Чтобы добавить одно значение в конец массива, используйте метод append() :
import array as arr # Исходный массив numbers = arr.array('i',[10,20,30]) # В конец numbers добавляется целое число 40 numbers.append(40) print(numbers) #output #array('i', [10, 20, 30, 40])
Имейте в виду, что новый элемент, который вы добавляете, должен иметь тот же тип данных, что и остальные элементы в массиве.
Посмотрите, что произойдет, если мы пытаемся добавить число с плавающей запятой в массив целых чисел:
import array as arr # Исходный массив numbers = arr.array('i',[10,20,30]) # В конец numbers добавляется число с плавающей запятой 40.0 numbers.append(40.0) print(numbers) #output #Traceback (most recent call last): # File "/Users/dionysialemonaki/python_articles/demo.py", line 19, in # numbers.append(40.0) #TypeError: 'float' object cannot be interpreted as an integer
Но что, если вы хотите добавить более одного значения в конец массива?
Тогда используйте метод extend() , который принимает итерируемый объект (например, список элементов) в качестве аргумента. Опять же, убедитесь, что все новые элементы имеют один и тот же тип данных.
import array as arr # Исходный массив numbers = arr.array('i',[10,20,30]) # Добавление целых чисел 40,50,60 в конец numbers # Числа берутся в квадратные скобки numbers.extend([40,50,60]) print(numbers) #output #array('i', [10, 20, 30, 40, 50, 60])
А что, если вы хотите добавить элемент не в конец массива? В таком случае используйте метод insert() : он позволяет добавить элемент на определенную позицию.
Функция insert() принимает два аргумента: индекс позиции, на которую будет вставлен новый элемент, и значение нового элемента.
import array as arr # Исходный массив numbers = arr.array('i',[10,20,30]) # Добавление целого числа 40 на первую позицию # Помните, что индексация начинается с 0 numbers.insert(0,40) print(numbers) #output #array('i', [40, 10, 20, 30])
Удаление значения из массива
Чтобы удалить элемент из массива, используйте метод remove() и укажите значение элемента в качестве аргумента.
import array as arr # Исходный массив numbers = arr.array('i',[10,20,30]) numbers.remove(10) print(numbers) #output #array('i', [20, 30])
С помощью remove() будет удален только первый экземпляр значения, которое вы передаете в качестве аргумента.
Посмотрите, что происходит, когда имеется несколько элементов с одинаковым значением:
import array as arr # Исходный массив numbers = arr.array('i',[10,20,30,10,20]) numbers.remove(10) print(numbers) #output #array('i', [20, 30, 10, 20])
Удаляется только первое вхождение числа 10 .
Вы также можете использовать метод pop() и указать позицию удаляемого элемента:
import array as arr # Исходный массив numbers = arr.array('i',[10,20,30,10,20]) # Удаление первого вхождения 10 numbers.pop(0) print(numbers) #output #array('i', [20, 30, 10, 20])
Заключение
Вот и все — теперь вы знаете, что такое массив в Python, как его создать с помощью модуля array и какие есть методы для работы с ним. Надеемся, это руководство было вам полезно.
Спасибо за чтение и успехов в написании кода!