Вся Россия

Использование библиотеки NumPy в Python: практическое руководство

KEDU
Автор статьи

Содержание

Дата публикации 19.12.2024 Обновлено 23.12.2024
Использование библиотеки NumPy в Python: практическое руководство
Источник фото: freepik
NumPy — это библиотека для научных вычислений, которая предоставляет мощный объект для работы с многомерными массивами и матрицами. Одним из главных преимуществ является способность эффективно работать с большими объемами данных, поддерживая операции над ними с минимальными затратами времени.

Зачем использовать NumPy вместо стандартных списков?

  1. Производительность, скорость: Эффективное хранение информации в памяти, оптимизация на уровне C.
  2. Низкое потребление памяти: Все элементы имеют одинаковый тип и хранятся в одном непрерывном участке памяти.
  3. Упрощение кода, читаемости: Операции выполняются без циклов, что делает код более компактным.
  4. Мощные функции для работы с многомерными данными: Поддерживает многомерность, что позволяет легко работать с данными в линейной алгебре, обработке изображений и машинном обучении.
  5. Векторизация, автоматизация: Автоматическое выполнение операций поэлементно, что ускоряет выполнение программы, уменьшает объем кода.

Установка и настройка

  1. Для использования NumPy необходимо установить библиотеку. Это можно сделать с помощью стандартного менеджера пакетов Python — pip. В командной строке нужно выполнить следующую команду: pip install numpy
  2. Если вы используете Anaconda, библиотека уже предустановлена в вашем окружении,  вам не нужно выполнять установку вручную. Для создания виртуального окружения в Anaconda можно использовать команду: conda create -n myenv numpy
  3. После успешной установки можно начинать использование. В начале работы необходимо импортировать библиотеку: import numpy as np

Основные структуры данных

1. Массив (ndarray)

Многомерные массивы с фиксированным типом данных, которые могут быть одномерными, двумерными, многомерными.

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

2. Матрица (matrix)

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

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

3. Булевые

Булевы массивы содержат значения True или False.

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

4. Структурированные (structured arrays)

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

5. Заполненные (empty, ones, zeros)

Создание массивов (np.), которые изначально заполняются заранее заданными значениями, такими как нули, единицы или случайные числа.

  • .zeros() - заполненный нулями.
  • .ones() - заполненный единицами.
  • .empty() - не заполняется значениями, оставляя его содержимое неопределенным.
  • .random.random() - заполненный случайными числами от 0 до 1.

Основные операции 

Название Описание
Арифметические Сложение, вычитание, умножение, деление выполняются поэлементно.
Сложение, вычитание  Наборы одинакового размера можно сложить или вычесть поэлементно без циклов.
Умножение, деление Поэлементное умножение и деление выполняются быстро, эффективно.
Матричные операции Матричное умножение, линейные операции с использованием .dot() или .matmul().
Транспонирование .T позволяет менять строки, столбцы.
Логические операции Сравнение компонентов, создание булевых массивов для фильтрации.
Изменение формы reshape() меняет форму без изменения информации.
Объединение, разбиение .concatenate() объединяет, а .split() делит их на части.
Векторизация операций Выполнение без циклов, что значительно ускоряет код.

Индексация и срезы

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

1. Одномерная индексация

  • Аналогична стандартным спискам Python.
  • Компоненты индексируются начиная с нуля.
  • Для доступа к последнему компоненту используется отрицательный индекс.
  • Быстрое извлечение отдельных компонентов.
  • Основа для работы, где важен порядок элементов.

2. Индексация для многомерных массивов

  • Индексация проводится для каждой оси.
  • Требуется указать строку, столбец.
  • Работает с использованием нескольких индексов, разделенных запятыми.
  • Позволяет извлекать данные на основе их расположения в строках, столбцах.
  • Используется для сложных структур, таких как матрицы или тензоры.

3. Срезы

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

4. Индексация с помощью масок

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

5. Индексация с использованием массивов индексов

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

6. Реверс

  • Легкая инвертированность с использованием срезов.
  • Реверс позволяет получать данные в обратном порядке.
  • Этот подход полезен при работе с временными рядами или другими упорядоченными данными.
  • Использование срезов для реверса ускоряет выполнение операций без дополнительных вычислений.

7. Индексация с шагом

  • С шагом можно извлекать элементы с определенным интервалом.
  • Шаг можно задавать отдельно для каждой оси.
  • Индексация с шагом позволяет работать с большими объемами данных более эффективно.
  • Этот метод используется для выборки через заданные интервалы.
  • Шаг может быть полезен при анализе выборок или обработке строк, столбцов.

8. Изменение значений

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

Функции и методы

Функция np. Описание
.add() Выполняет поэлементное сложение.
.subtract() Выполняет поэлементное вычитание
.multiply() Выполняет поэлементное умножение
.divide() Выполняет поэлементное деление
.power() Возводит элементы в заданную степень.
.mean() Вычисляет среднее значение компонентов.
.median() Вычисляет медиану  компонентов.
.std() Вычисляет стандартное отклонение.
.var() Вычисляет дисперсию.
.min() / .max() Возвращает минимальное/максимальное значение.
.reshape() Изменяет форму без изменения данных.
.flatten() Преобразует многомерный массив в одномерный.
.transpose() Транспонирует (меняет строки и столбцы местами).
.squeeze() Удаляет размерности размером 1.
.expand_dims() Добавляет новую ось, увеличивая размерность.
.isnan() Проверяет, является ли элемент массива NaN (Not a Number).
.nanmean() Вычисляет среднее значение, игнорируя NaN.
.nanstd() Вычисляет стандартное отклонение, игнорируя NaN.
.nanmin() / .nanmax() Находит минимальное/максимальное значение, игнорируя NaN.
.nan_to_num() Заменяет NaN значения на заданные числа (например, 0).
.dot() Выполняет матричное умножение.
.linalg.inv() Вычисляет обратную матрицу.
.linalg.det() Вычисляет детерминант матрицы.
.linalg.eig() Вычисляет собственные значения и собственные векторы матрицы.
.linalg.solve() Решает систему линейных уравнений.
.random.rand() Генерирует набор случайных чисел с равномерным распределением от 0 до 1.
.random.randn() Генерирует набор случайных чисел с нормальным распределением (среднее 0, стандартное отклонение 1).
.random.randint() Генерирует случайные целые числа в заданном диапазоне.
.random.choice() Выбирает случайные комопненты с возможностью повторений.
.random.seed() Устанавливает начальное значение для генератора случайных чисел, что позволяет получать воспроизводимые результаты.
.unique() Находит уникальные элементы.
.concatenate() Объединяет несколько наборов вдоль указанной оси.
.split() Разделяет набор на несколько частей.
.tile() Повторяет набор несколько раз, чтобы создать новый.
.repeat() Повторяет элементы заданное количество раз.

Оптимизация и производительность

  1. Векторизация позволяет выполнять операции без циклов, что значительно ускоряет выполнение.
  2. Функции .sum() и .dot(), выполняются быстрее стандартных Python-операций благодаря реализации на C.
  3. Используется эффективное распределение памяти, что ускоряет доступ к данным.
  4. Срезы не создают копий, а лишь создают представления данных, что помогает экономить память.
  5. Поддерживается многозадачность, что ускоряет выполнение на многоядерных процессорах при использовании .dot().
  6. Правильный выбор типа данных помогает ускорить вычисления, а также снизить потребление памяти.
  7. Numba компилирует Python-код в машинный код.
  8. Cython компилирует Python в C, что ускоряет выполнение функций, работающих с NumPy.
  9. Библиотека SciPy включает дополнительные инструменты для оптимизации и ускорения вычислений.

История успеха программиста, использующего NumPy

Одним из успешных пользователей библиотеки является Николай Аверин, исследователь данных в области здравоохранения. Используя NumPy, он смог обработать и проанализировать огромные массивы медицинской информации, что позволило разработать алгоритмы для прогнозирования заболеваний на основе анализа сведений о пациентах. Благодаря NumPy Иван смог ускорить процесс вычислений на 30%, что позволило ему сосредоточиться на более важных аспектах исследования.

Заключение

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

Вопрос — ответ
Что такое NumPy?

Почему NumPy быстрее стандартных списков?

Как NumPy помогает в оптимизации вычислений?
Комментарии
Всего
2
2024-12-23T00:00:00+05:00
NumPy + Pandas = 90% обработки данных. Но NumPy всё равно ближе, особенно для массивов
2024-12-21T00:00:00+05:00
Булевые маски огонь. Писал фильтр для данных, раньше кучу строк кода гонял, а теперь в одну строчку всё
Читайте также
Все статьи