1. Основы вычислительной математики и работа с многомерными массивами ndarray в библиотеке NumPy
Основы вычислительной математики и работа с многомерными массивами ndarray в библиотеке NumPy
Добро пожаловать в курс «Python для анализа данных»! Мы начинаем наше погружение в мир Data Science с фундаментальной библиотеки, на которой держится практически вся экосистема научного Python. Речь пойдет о NumPy.
Даже если ваша конечная цель — строить сложные нейронные сети с помощью PyTorch или анализировать финансовые рынки в Pandas, без понимания того, как работают массивы NumPy, вы будете строить дом без фундамента. В этой статье мы разберем, почему стандартные списки Python не подходят для серьезных вычислений, что такое тензоры и как выполнять математические операции над миллионами чисел за доли секунды.
Почему Python нужен NumPy?
Python — прекрасный язык: он читаемый, гибкий и простой в изучении. Однако у него есть существенный недостаток: он медленный при выполнении большого количества математических операций в циклах.
Представьте, что у вас есть два списка по миллиону чисел, и вы хотите их сложить поэлементно. В чистом Python вам пришлось бы писать цикл for. Это долго, потому что Python является интерпретируемым языком с динамической типизацией. При каждой итерации интерпретатор должен проверять тип данных, выделять память и искать методы сложения.
NumPy (Numerical Python) решает эту проблему. Основная часть этой библиотеки написана на языках C и C++, что позволяет выполнять вычисления с невероятной скоростью, сохраняя при этом удобный синтаксис Python.
Ключевые преимущества NumPy:
Основа всего: объект ndarray
Центральным элементом библиотеки является объект ndarray (N-dimensional array — -мерный массив). В отличие от списков Python, которые могут содержать смесь целых чисел, строк и словарей, массив NumPy обязан быть гомогенным (однородным). Это значит, что все элементы массива должны иметь один и тот же тип данных (например, только int64 или только float32).
Для начала работы необходимо импортировать библиотеку. Общепринятым стандартом является сокращение np.
Создание массивов
Самый простой способ создать массив — преобразовать обычный список Python:
NumPy также предоставляет удобные функции для генерации данных:
* np.zeros((3, 4)) — создает массив размером 3x4, заполненный нулями.
* np.ones((2, 2)) — создает массив, заполненный единицами.
* np.arange(0, 10, 2) — аналог range() в Python: создает массив от 0 до 10 с шагом 2 ([0, 2, 4, 6, 8]).
* np.linspace(0, 1, 5) — создает 5 чисел, равномерно распределенных на отрезке от 0 до 1.
Размерность, форма и тип данных
В анализе данных и машинном обучении критически важно понимать структуру ваших данных. У каждого объекта ndarray есть атрибуты, которые помогают в этом разобраться.
Основные атрибуты:
* .ndim — количество измерений (осей).
* 1 — вектор.
* 2 — матрица.
* 3 и более — тензор.
* .shape — кортеж, показывающий размер массива по каждому измерению. Например, (2, 3) означает 2 строки и 3 столбца.
* .size — общее количество элементов в массиве.
* .dtype — тип данных элементов (например, int32, float64).
Пример:
Вычислительная математика: Векторизация
Векторизация — это способность выполнять операции над целыми массивами без написания циклов. Это не только делает код короче, но и позволяет процессору использовать специальные инструкции (SIMD) для параллельной обработки данных.
Рассмотрим простую математическую операцию: сложение двух векторов. В математике это записывается так:
Где — результирующий вектор, а и — исходные векторы одинаковой длины. Поэлементно это выглядит так:
Где — -й элемент вектора результата, — -й элемент первого вектора, — -й элемент второго вектора.
В коде NumPy это выглядит элементарно:
Вы можете применять любые арифметические операции (+, -, , /, *) к массивам. Операция будет применена к каждому элементу.
Агрегирующие функции
Часто нам нужно получить одну сводную характеристику массива, например, сумму всех элементов или среднее значение.
Математически среднее арифметическое (mean) записывается формулой:
Где — среднее значение, — количество элементов, — знак суммирования, — каждый отдельный элемент массива.
В NumPy:
Индексация и срезы (Slicing)
Работа с индексами в NumPy похожа на работу со списками Python, но с расширенными возможностями для многомерных массивов.
Одномерные массивы
Доступ осуществляется так же, как и в списках:arr[0] — первый элемент, arr[-1] — последний. Срезы работают по принципу [start:stop:step].Многомерные массивы
Здесь начинается магия. Элементы разделяются запятой внутри квадратных скобок:[строки, столбцы].!Визуализация принципов индексации и срезов в двумерной матрице.
Пример:
Практическое применение: Линейная алгебра
Машинное обучение базируется на линейной алгебре. Одной из самых частых операций является перемножение матриц (Dot Product).
Если у нас есть матрица размером и матрица размером , то их произведение будет иметь размер . Элемент новой матрицы рассчитывается как скалярное произведение строки первой матрицы на столбец второй:
Где — элемент новой матрицы на пересечении -й строки и -го столбца, — элементы строки первой матрицы, — элементы столбца второй матрицы.
В NumPy для этого используется функция np.dot() или оператор @:
Заключение
Мы рассмотрели основы библиотеки NumPy: создание массивов ndarray, их атрибуты, базовую арифметику и индексацию. Это тот фундамент, на котором строятся более сложные инструменты, такие как Pandas (для табличных данных) и Matplotlib (для визуализации), которые мы изучим в следующих статьях курса.
Помните: в Data Science данные почти всегда представлены в виде массивов чисел. Картинка — это трехмерный массив пикселей (высота, ширина, цвет). Звук — это одномерный массив амплитуд. Таблица Excel — это двумерный массив. И NumPy — это универсальный ключ к работе с ними.