NumPy (Numerical Python) – это фундаментальная библиотека Python для численных вычислений. Она предоставляет мощные инструменты для работы с многомерными массивами и матрицами, а также широкий набор математических функций для операций над этими массивами. В этом руководстве мы рассмотрим основы создания массивов NumPy, их атрибуты, методы индексации и срезов, а также сравним производительность NumPy с обычными списками Python.
Что такое NumPy и зачем он нужен для работы с массивами?
Обзор библиотеки NumPy и её роль в Python
NumPy является краеугольным камнем для многих библиотек Python, используемых в научных вычислениях, анализе данных и машинном обучении, таких как SciPy, pandas, scikit-learn и TensorFlow. Она обеспечивает эффективное хранение и обработку больших объемов данных, что критически важно для многих задач.
Преимущества использования NumPy для работы с массивами
-
Производительность: NumPy массивы хранятся в памяти непрерывно, что позволяет выполнять векторные операции значительно быстрее, чем при работе с списками Python.
-
Функциональность: NumPy предоставляет богатый набор функций для математических, статистических и логических операций над массивами.
-
Удобство: NumPy упрощает работу с многомерными данными благодаря удобной системе индексации и срезов.
-
Интеграция: NumPy легко интегрируется с другими библиотеками Python для анализа данных и машинного обучения.
Основные типы данных NumPy и атрибуты массивов
Обзор основных типов данных: int, float, bool, complex
NumPy поддерживает различные числовые типы данных, включая:
-
int: Целые числа (int8, int16, int32, int64). -
float: Числа с плавающей точкой (float16, float32, float64). -
bool: Логические значения (True, False). -
complex: Комплексные числа (complex64, complex128).
При создании массива NumPy автоматически определяет наиболее подходящий тип данных на основе переданных значений. Тип данных можно указать явно с помощью аргумента dtype.
Атрибуты массивов: shape, dtype, ndim, size
Каждый массив NumPy обладает следующими атрибутами:
-
shape: Кортеж, определяющий размерность массива. Например,(3, 4)означает массив с 3 строками и 4 столбцами. -
dtype: Тип данных элементов массива. Например,int32илиfloat64. -
ndim: Количество измерений массива. Например, 1 для одномерного массива, 2 для двумерного. -
size: Общее количество элементов в массиве.
Пример:
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr.shape) # Вывод: (2, 3)
print(arr.dtype) # Вывод: int64 (или int32, в зависимости от системы)
print(arr.ndim) # Вывод: 2
print(arr.size) # Вывод: 6
Создание массивов NumPy: Основы
Создание массивов с использованием numpy.array()
Самый простой способ создать массив NumPy – использовать функцию numpy.array(), передав ей список или кортеж:
import numpy as np
arr = np.array([1, 2, 3, 4, 5]) # Создание одномерного массива
arr2d = np.array([[1, 2, 3], [4, 5, 6]]) # Создание двумерного массива
Создание массивов, заполненных нулями и единицами (numpy.zeros(), numpy.ones())
Функции numpy.zeros() и numpy.ones() позволяют создавать массивы, заполненные нулями и единицами, соответственно. Необходимо указать размерность массива в виде кортежа:
import numpy as np
zeros_arr = np.zeros((2, 3)) # Создание массива 2x3, заполненного нулями
ones_arr = np.ones((3, 2)) # Создание массива 3x2, заполненного единицами
Продвинутые методы создания массивов NumPy
Создание массивов с использованием numpy.arange() и numpy.linspace()
-
numpy.arange()создает массив с равномерно распределенными значениями в заданном диапазоне, подобно встроенной функцииrange():Рекламаimport numpy as np
arr = np.arange(0, 10, 2) # Создание массива [0 2 4 6 8] «`
-
numpy.linspace()создает массив с указанным количеством равномерно распределенных значений в заданном диапазоне:import numpy as np
arr = np.linspace(0, 1, 5) # Создание массива [0. 0.25 0.5 0.75 1. ] «`
Инициализация массивов из списков и других итерируемых объектов
Функция numpy.array() может принимать любые итерируемые объекты, такие как списки, кортежи, генераторы и другие массивы NumPy, для создания новых массивов.
import numpy as np
list_data = [1, 2, 3, 4, 5]
arr_from_list = np.array(list_data)
tuple_data = (6, 7, 8, 9, 10)
arr_from_tuple = np.array(tuple_data)
Индексация и срезы массивов NumPy
Доступ к элементам массива с использованием индексов
Доступ к элементам массива осуществляется с помощью индексов, аналогично спискам Python. Индексация начинается с 0.
import numpy as np
arr = np.array([10, 20, 30, 40, 50])
print(arr[0]) # Вывод: 10
print(arr[3]) # Вывод: 40
arr2d = np.array([[1, 2, 3], [4, 5, 6]])
print(arr2d[0, 1]) # Вывод: 2 (элемент в первой строке и втором столбце)
Использование срезов для извлечения подмножеств массива
Срезы позволяют извлекать подмножества массива, указывая начальный и конечный индексы, а также шаг:
import numpy as np
arr = np.array([10, 20, 30, 40, 50])
print(arr[1:4]) # Вывод: [20 30 40]
print(arr[:3]) # Вывод: [10 20 30]
print(arr[::2]) # Вывод: [10 30 50]
arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr2d[:2, 1:]) # Вывод: [[2 3]
# [5 6]]
Практическое применение и сравнение с списками Python
Математические операции с массивами NumPy: сложение, вычитание, умножение и деление
NumPy позволяет выполнять математические операции над массивами поэлементно. Это значительно эффективнее, чем использование циклов Python для выполнения тех же операций над списками.
import numpy as np
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
print(arr1 + arr2) # Вывод: [5 7 9] (сложение)
print(arr1 * arr2) # Вывод: [ 4 10 18] (умножение)
Сравнение производительности NumPy и списков Python, примеры использования в задачах анализа данных
NumPy значительно превосходит списки Python по производительности при работе с большими объемами данных. Это связано с тем, что NumPy массивы хранятся в памяти непрерывно и используют оптимизированные алгоритмы для выполнения операций.
Пример:
import numpy as np
import time
size = 1000000
# Сравнение времени сложения двух списков
list1 = range(size)
list2 = range(size)
start_time = time.time()
result_list = [x + y for x, y in zip(list1, list2)]
list_time = time.time() - start_time
# Сравнение времени сложения двух массивов NumPy
arr1 = np.arange(size)
arr2 = np.arange(size)
start_time = time.time()
result_arr = arr1 + arr2
numpy_time = time.time() - start_time
print(f"Время сложения списков: {list_time:.4f} сек")
print(f"Время сложения массивов NumPy: {numpy_time:.4f} сек")
print(f"NumPy быстрее в {list_time / numpy_time:.2f} раз")
В задачах анализа данных NumPy часто используется для:
-
Предобработки данных (очистка, нормализация, заполнение пропущенных значений).
-
Вычисления статистических показателей (среднее, медиана, стандартное отклонение).
-
Фильтрации и сортировки данных.
-
Выполнения математических операций над данными.
Заключение
NumPy – это мощный инструмент для работы с массивами в Python. Он предоставляет высокую производительность, удобную систему индексации и срезов, а также богатый набор математических функций. Знание NumPy необходимо для эффективной работы в области научных вычислений, анализа данных и машинного обучения.