Руководство по массивам в Python

Руководство по массивам в Python

Введение

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

Массивы являются одной из наиболее фундаментальных и широко используемых структур данных.

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

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

Понимание структуры данных массива

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

Массив — это совокупность элементов, обычно того же типа, Хранится в смежные ячейки памяти.

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

Например, рассмотрим массив целых чисел: [10, 20, 30, 40, 50]. Здесь элемент 20 имеет индекс 1:

индексирование массива Python

Есть несколько Преимущества использования массивов для хранения наших данных. Например, благодаря своей структуре памяти массивы позволяют O (1) (постоянная) временная сложность при доступе к элементу по его индексу. Это особенно полезно, когда нам нужен произвольный доступ к элементам. Кроме того, массивы хранятся в смежные ячейки памяти, что может привести к лучшей локальности кэша и общему повышению производительности при выполнении определенных операций. Еще одним заметным преимуществом использования массивов является то, что, поскольку после объявления массивы имеют фиксированный размер, легче управлять памятью и избегать неожиданных переполнений или ошибок нехватки памяти.

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

С другой стороны, массивы имеют свой собственный набор недостатки. Одним из основных ограничений традиционных массивов является их исправленный размер. После создания массива его размер невозможно изменить. Это может привести к таким проблемам, как нерациональная трата памяти (если массив слишком велик) или необходимость изменения размера (если массив слишком мал). Кроме того, вставка или удаление элемента в середине массива требует смещения элементов, что приводит к О (п) временная сложность этих операций.

Подводя итог всему этому, давайте проиллюстрируем основные характеристики массивов на примере плейлиста песен из начала этого руководства. Массив – это структура данных, которая:

  • Индексируется: Точно так же, как каждая песня в вашем плейлисте имеет номер (1, 2, 3,…), каждый элемент массива имеет индекс. Но в большинстве языков программирования индекс начинается с 0. Итак, первый элемент имеет индекс 0, второй — с индексом 1 и так далее.

  • Имеет фиксированный размер: Когда вы создаете плейлист, скажем, из 10 песен, вы не можете добавить 11-ю песню, не удалив предварительно одну. Аналогично, массивы имеют фиксированный размер. Создав массив определенного размера, вы не сможете добавить больше элементов, чем его вместимость.

  • однороден: все песни в вашем плейлисте являются музыкальными композициями. Аналогично, все элементы массива имеют один и тот же тип. Если у вас есть массив целых чисел, вы не сможете внезапно сохранить в нем текстовую строку.

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

  • Непрерывная память: Это немного более технический вопрос. Когда массив создается в памяти компьютера, он занимает непрерывный блок памяти. Думайте об этом как о ряде соседних шкафчиков в школе. Каждый шкафчик расположен рядом с другим, без промежутков между ними.

Python и массивы

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

На первый взгляд, Список Python может показаться синонимом массива, но есть тонкие различия и нюансы, которые следует учитывать:

Список массив
Встроенная структура данных Python. Не встроены в Python — они взяты из модуля array.
Динамический размер Фиксированный (предустановленный) размер
Может хранить элементы разных типов данных Храните предметы одного типа
Предоставлять ряд встроенных методов для манипуляций. Необходимо импортировать внешние модули
O(1) временная сложность операций доступа O(1) временная сложность операций доступа
Потребляйте больше памяти Более эффективное использование памяти

Глядя на эту таблицу, естественно задаться вопросом: «Когда какой использовать?». Что ж, если вам нужна коллекция, которая может динамически увеличиваться или уменьшаться и может содержать смешанные типы данных, список Python — это то, что вам нужно. Однако для сценариев, требующих более эффективного использования памяти коллекции с элементами одного типа, вы можете рассмотреть возможность использования Python array модуль или внешние библиотеки, такие как NumPy.

Ассоциация массив Модуль на Python

Когда большинство разработчиков думают о массивах в Python, они часто по умолчанию думают о списках. Однако Python предлагает более специализированную структуру массива благодаря встроенному array модуль. Этот модуль обеспечивает эффективное хранение базовых типов данных в стиле C в Python.

Хотя списки Python невероятно универсальны и могут хранить объекты любого типа, иногда они могут быть излишними, особенно когда вам нужно хранить только коллекцию базовых типов данных, таких как целые числа или числа с плавающей запятой. array Модуль предоставляет возможность создавать массивы, которые более эффективно используют память, чем списки для определенных типов данных.

Создание массива

Для использования array модуль, вам сначала нужно его импортировать:

from array import array

После импорта вы можете создать массив, используя array() конструктор:

arr = array('i', [1, 2, 3, 4, 5])
print(arr)

Здесь 'i' аргумент указывает, что массив будет хранить подписанные целые. Доступно несколько других кодов типов, например 'f' для поплавков и 'd' для двойников.

Доступ и изменение элементов

Вы можете получать доступ к элементам массива и изменять их так же, как и в случае со списком:

print(arr[2]) 

А теперь давайте изменим элемент, изменив его значение на 6:

arr[2] = 6
print(arr) 

Методы массива

Ассоциация array модуль предоставляет несколько методов для управления массивами:

  • append() – Добавляет элемент в конец массива:

    arr.append(7)
    print(arr) 
  • extend() – Добавляет итерируемые элементы в конец:

    arr.extend([8, 9])
    print(arr) 
  • pop() – Удаляет и возвращает элемент в заданной позиции:

    arr.pop(2)
    print(arr) 
  • remove(): Удаляет первое вхождение указанного значения:

    arr.remove(2)
    print(arr) 
  • reverse(): меняет порядок массива:

    arr.reverse()
    print(arr) 

Примечание: Существует больше методов, чем мы перечислили здесь. Обратитесь к официальная документация Python чтобы увидеть список всех доступных методов в array модуль.

Если array модуль предлагает более эффективный способ хранения основных типов данных, важно помнить его недостатки. В отличие от списков массивы (гомогенный). Это означает, что все элементы массива должны быть одного типа. Кроме того, вы можете хранить только базовые типы данных в стиле C в массивах. Если вам нужно хранить пользовательские объекты или другие типы Python, вам нужно будет использовать список или другую структуру данных.

Массивы NumPy

NumPy, сокращение от Numerical Python, — это базовый пакет для числовых вычислений на Python. Одной из его основных особенностей является мощный Объект N-мерного массива, который предлагает быстрые операции с массивами, включая математические, логические манипуляции, манипуляции с фигурами и многое другое.

Массивы NumPy более универсальны, чем встроенные в Python. array модуль и являются основным продуктом в проектах по науке о данных и машинному обучению.

Зачем использовать массивы NumPy?

Первое, что приходит в голову, это производительность. Массивы NumPy реализованы на C и обеспечивают эффективное хранение памяти и более быстрые операции благодаря оптимизированным алгоритмам и преимуществам непрерывного хранения памяти.

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

Ознакомьтесь с нашим практическим руководством по изучению Git с рекомендациями, принятыми в отрасли стандартами и прилагаемой памяткой. Перестаньте гуглить команды Git и на самом деле изучить это!

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

Примечание: Если вы заранее знаете размер данных, предварительное выделение памяти для массивов (особенно в NumPy) может привести к повышению производительности.

Создание массива NumPy

Чтобы использовать NumPy, сначала необходимо его установить (pip install numpy), а затем импортируйте его:

import numpy as np

После импорта вы можете создать массив NumPy, используя команду array() функция:

arr = np.array([1, 2, 3, 4, 5])
print(arr) 

Вы также можете создавать многомерные массивы:

matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(matrix)

Это даст нам:

[[1 2 3] [4 5 6] [7 8 9]]

Помимо этих основных способов создания массивов, NumPy предоставляет нам другие умные способы создания массивов. Одним из которых является arange() метод. Он создает массивы с регулярно увеличивающимися значениями:

arr = np.arange(10)
print(arr) 

Еще один linspace() метод, который создает массивы с указанным количеством элементов, равномерно расположенных между указанными начальными и конечными значениями:

even_space = np.linspace(0, 1, 5)
print(even_space) 

Доступ и изменение элементов

Доступ к элементам массива NumPy и их изменение интуитивно понятны:

print(arr[2]) arr[2] = 6
print(arr) 

Примерно то же самое делаем и с многомерными массивами:

print(matrix[1, 2]) matrix[1, 2] = 10
print(matrix)

Изменит значение элемента во второй строке (индекс 1) и третий столбец (индекс 2):

[[1 2 3] [4 5 20] [7 8 9]]

Изменение формы массива

NumPy предлагает множество функций и методов для манипулирования массивами и работы с ними. Например, вы можете использовать reshape() метод для изменить форму массива. Допустим, у нас есть простой массив:

import numpy as np arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
print("Original Array:")
print(arr) 

И мы хотим преобразовать его в матрицу 3×4. Все, что вам нужно сделать, это использовать reshape() метод с желаемыми размерами, переданными в качестве аргументов:


reshaped_arr = arr.reshape(3, 4)
print("Reshaped Array (3x4):")
print(reshaped_arr)

Это приведет к:

Reshaped Array (3x4):
[[ 1 2 3 4] [ 5 6 7 8] [ 9 10 11 12]]

Умножение матриц

Ассоциация numpy.dot() метод используется для умножение матриц. Он возвращает скалярное произведение двух массивов. Для одномерных массивов это внутренний продукт массивов. Для двумерных массивов это эквивалентно умножение матриц, а для ND это суммарный продукт по последней оси первого массива и предпоследней оси второго массива.

Давайте посмотрим, как это работает. Во-первых, давайте вычислим скалярное произведение двух одномерных массивов (внутреннее произведение векторов):

import numpy as np vec1 = np.array([1, 2, 3])
vec2 = np.array([4, 5, 6])
dot_product_1d = np.dot(vec1, vec2) print("Dot product of two 1-D arrays:")
print(dot_product_1d) 

Это приведет к:

Dot product of two 1-D arrays:
32

32 по сути, является внутренним продуктом двух массивов – (14 + 25 + 3*6). Далее мы можем выполнить матричное умножение двух двумерных массивов:


mat1 = np.array([[1, 2], [3, 4]])
mat2 = np.array([[2, 0], [1, 3]])
matrix_product = np.dot(mat1, mat2) print("Matrix multiplication of two 2-D arrays:")
print(matrix_product) 

Что даст нам:

Matrix multiplication of two 2-D arrays:
[[ 4 6] [10 12]]

Массивы NumPy — это значительный шаг вперед по сравнению со встроенными списками Python и array модуль, особенно для научных и математических вычислений. Их эффективность в сочетании с богатым функционалом, предоставляемым библиотекой NumPy, делает их незаменимым инструментом для всех, кто хочет выполнять числовые операции на Python.

Заключение

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

На протяжении всего этого руководства мы прошли путь от основополагающих концепций массивов до их практического применения в Python. Мы видели, как массивы, благодаря своей непрерывности в памяти, обеспечивают быстрое время доступа и как динамические списки Python обеспечивают дополнительный уровень гибкости. Мы также углубились в специализированный мир NumPy, где массивы превращаются в мощные инструменты для числовых вычислений.

Отметка времени:

Больше от Стекабьюс