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







Зачем использовать NumPy вместо стандартных списков?
- Производительность, скорость: Эффективное хранение информации в памяти, оптимизация на уровне C.
- Низкое потребление памяти: Все элементы имеют одинаковый тип и хранятся в одном непрерывном участке памяти.
- Упрощение кода, читаемости: Операции выполняются без циклов, что делает код более компактным.
- Мощные функции для работы с многомерными данными: Поддерживает многомерность, что позволяет легко работать с данными в линейной алгебре, обработке изображений и машинном обучении.
- Векторизация, автоматизация: Автоматическое выполнение операций поэлементно, что ускоряет выполнение программы, уменьшает объем кода.
Установка и настройка
- Для использования NumPy необходимо установить библиотеку. Это можно сделать с помощью стандартного менеджера пакетов Python — pip. В командной строке нужно выполнить следующую команду: pip install numpy
- Если вы используете Anaconda, библиотека уже предустановлена в вашем окружении, вам не нужно выполнять установку вручную. Для создания виртуального окружения в Anaconda можно использовать команду: conda create -n myenv numpy
- После успешной установки можно начинать использование. В начале работы необходимо импортировать библиотеку: 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() | Повторяет элементы заданное количество раз. |
Оптимизация и производительность
- Векторизация позволяет выполнять операции без циклов, что значительно ускоряет выполнение.
- Функции .sum() и .dot(), выполняются быстрее стандартных Python-операций благодаря реализации на C.
- Используется эффективное распределение памяти, что ускоряет доступ к данным.
- Срезы не создают копий, а лишь создают представления данных, что помогает экономить память.
- Поддерживается многозадачность, что ускоряет выполнение на многоядерных процессорах при использовании .dot().
- Правильный выбор типа данных помогает ускорить вычисления, а также снизить потребление памяти.
- Numba компилирует Python-код в машинный код.
- Cython компилирует Python в C, что ускоряет выполнение функций, работающих с NumPy.
- Библиотека SciPy включает дополнительные инструменты для оптимизации и ускорения вычислений.
История успеха программиста, использующего NumPy
Одним из успешных пользователей библиотеки является Николай Аверин, исследователь данных в области здравоохранения. Используя NumPy, он смог обработать и проанализировать огромные массивы медицинской информации, что позволило разработать алгоритмы для прогнозирования заболеваний на основе анализа сведений о пациентах. Благодаря NumPy Иван смог ускорить процесс вычислений на 30%, что позволило ему сосредоточиться на более важных аспектах исследования.
Заключение
NumPy — это мощная библиотека, которая значительно расширяет возможности Python для работы с массивами и многомерными данными. Она предоставляет богатый набор функций для выполнения математических, статистических и логических операций.