Введение в NumPy
Что такое NumPy и зачем он нужен?
NumPy (Numerical Python) — это фундаментальная библиотека для научных вычислений в Python. Она предоставляет мощные инструменты для работы с многомерными массивами (ndarray), а также функции для выполнения математических операций над этими массивами. NumPy является основой для многих других библиотек, таких как SciPy, pandas и scikit-learn, которые используются в анализе данных, машинном обучении и других областях.
В контексте интернет-маркетинга и веб-программирования, NumPy может быть использован для обработки данных о пользователях, анализа эффективности рекламных кампаний, обработки изображений и звука, а также для создания рекомендательных систем.
Преимущества использования NumPy для работы с массивами
- Скорость и эффективность: NumPy реализует многие операции на C, что обеспечивает высокую производительность при работе с большими объемами данных.
- Удобство: Библиотека предоставляет простой и интуитивно понятный интерфейс для работы с массивами.
- Функциональность: NumPy содержит широкий набор функций для выполнения математических, статистических и логических операций над массивами.
- Интеграция: NumPy легко интегрируется с другими библиотеками Python, такими как SciPy, pandas и matplotlib.
Установка NumPy: пошаговая инструкция
Для установки NumPy используйте менеджер пакетов pip
:
pip install numpy
Или, если вы используете Anaconda:
conda install numpy
Импорт библиотеки NumPy: соглашение об именах (np)
После установки NumPy, импортируйте ее в свой код, используя общепринятое соглашение об именах np
:
import numpy as np
Основы работы с массивами NumPy (ndarray)
Создание массивов NumPy различными способами
NumPy предоставляет несколько способов создания массивов:
Массивы из списков Python
import numpy as np
# Создание массива из списка
my_list = [1, 2, 3, 4, 5]
my_array = np.array(my_list)
print(my_array) # Вывод: [1 2 3 4 5]
# Создание двумерного массива из списка списков
my_matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
my_array2d = np.array(my_matrix)
print(my_array2d)
# Вывод:
# [[1 2 3]
# [4 5 6]
# [7 8 9]]
Массивы, заполненные нулями, единицами и другими значениями
import numpy as np
# Создание массива из нулей
zeros_array = np.zeros((3, 4))
print(zeros_array)
# Создание массива из единиц
ones_array = np.ones((2, 3))
print(ones_array)
# Создание массива, заполненного определенным значением
full_array = np.full((2, 2), 7)
print(full_array)
Массивы с последовательностями чисел (arange, linspace)
import numpy as np
# Создание массива с последовательностью чисел от 0 до 9
arange_array = np.arange(10)
print(arange_array)
# Создание массива с последовательностью чисел от 2 до 10 с шагом 2
arange_array_step = np.arange(2, 11, 2)
print(arange_array_step)
# Создание массива с 5 числами, равномерно распределенными между 0 и 1
linspace_array = np.linspace(0, 1, 5)
print(linspace_array)
Создание массивов случайных чисел
import numpy as np
# Создание массива случайных чисел от 0 до 1
rand_array = np.random.rand(3, 2)
print(rand_array)
# Создание массива случайных целых чисел от 0 до 9
randint_array = np.random.randint(0, 10, (2, 3))
print(randint_array)
Атрибуты массивов NumPy: shape, dtype, size, ndim
import numpy as np
my_array = np.array([[1, 2, 3], [4, 5, 6]])
# Размерность массива
print(my_array.shape) # Вывод: (2, 3)
# Тип данных элементов массива
print(my_array.dtype) # Вывод: int64 (или другой целочисленный тип)
# Количество элементов в массиве
print(my_array.size) # Вывод: 6
# Количество измерений массива
print(my_array.ndim) # Вывод: 2
Изменение формы массива (reshape)
import numpy as np
my_array = np.arange(12)
print(my_array)
# Изменение формы массива на 3x4
reshaped_array = my_array.reshape(3, 4)
print(reshaped_array)
Индексация и срезы массивов NumPy
Доступ к элементам массива по индексу
import numpy as np
my_array = np.array([10, 20, 30, 40, 50])
# Доступ к первому элементу
print(my_array[0]) # Вывод: 10
# Доступ к последнему элементу
print(my_array[-1]) # Вывод: 50
my_array2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# Доступ к элементу во второй строке и третьем столбце
print(my_array2d[1, 2]) # Вывод: 6
Срезы массивов: получение подмассивов
import numpy as np
my_array = np.array([10, 20, 30, 40, 50])
# Получение подмассива с элементами от второго до четвертого
print(my_array[1:4]) # Вывод: [20 30 40]
# Получение подмассива с элементами от начала до третьего
print(my_array[:3]) # Вывод: [10 20 30]
# Получение подмассива с элементами от третьего до конца
print(my_array[3:]) # Вывод: [40 50]
# Получение каждого второго элемента
print(my_array[::2]) # Вывод: [10 30 50]
Многомерная индексация и срезы
import numpy as np
my_array2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# Получение второй строки
print(my_array2d[1, :]) # Вывод: [4 5 6]
# Получение второго столбца
print(my_array2d[:, 1]) # Вывод: [2 5 8]
# Получение подматрицы
print(my_array2d[:2, :2])
# Вывод:
# [[1 2]
# [4 5]]
Копирование и представление (view) массивов
import numpy as np
my_array = np.array([1, 2, 3, 4, 5])
# Создание представления (view) массива
my_view = my_array[1:4]
print(my_view) # Вывод: [2 3 4]
# Изменение значения в представлении отразится на исходном массиве
my_view[0] = 100
print(my_array) # Вывод: [ 1 100 3 4 5]
# Создание копии массива
my_copy = my_array.copy()
my_copy[0] = 200
print(my_array) # Вывод: [ 1 100 3 4 5]
print(my_copy) # Вывод: [200 100 3 4 5]
Основные операции с массивами NumPy
Арифметические операции: +, -, *, /, **, %
import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print(a + b) # Вывод: [5 7 9]
print(a - b) # Вывод: [-3 -3 -3]
print(a * b) # Вывод: [ 4 10 18]
print(a / b) # Вывод: [0.25 0.4 0.5 ]
print(a ** 2) # Вывод: [1 4 9]
print(b % 2) # Вывод: [0 1 0]
Универсальные функции (ufuncs): sin, cos, exp, log и другие
import numpy as np
a = np.array([0, np.pi/2, np.pi])
print(np.sin(a)) # Вывод: [0.000e+00 1.000e+00 1.225e-16]
print(np.cos(a)) # Вывод: [ 1.000e+00 6.123e-17 -1.000e+00]
print(np.exp(a)) # Вывод: [ 1. 4.810 23.141]
print(np.log(np.array([1, 2.71, 7.38]))) # Вывод: [0. 0.996 2. ]
Математические и статистические функции: sum, mean, std, var, min, max, argmin, argmax
import numpy as np
a = np.array([1, 2, 3, 4, 5])
print(np.sum(a)) # Вывод: 15
print(np.mean(a)) # Вывод: 3.0
print(np.std(a)) # Вывод: 1.414
print(np.var(a)) # Вывод: 2.0
print(np.min(a)) # Вывод: 1
print(np.max(a)) # Вывод: 5
print(np.argmin(a)) # Вывод: 0 (индекс минимального элемента)
print(np.argmax(a)) # Вывод: 4 (индекс максимального элемента)
Операции сравнения: >, =, <=
import numpy as np
a = np.array([1, 2, 3, 4, 5])
b = np.array([3, 2, 1, 4, 6])
print(a > b) # Вывод: [False False True False False]
print(a < b) # Вывод: [ True False False False True]
print(a == b) # Вывод: [False True False True False]
print(a != b) # Вывод: [ True False True False True]
print(a >= b) # Вывод: [False True True True False]
print(a <= b) # Вывод: [ True True False True True]
Логические операции: & (and), | (or), ^ (xor), ~ (not)
import numpy as np
a = np.array([True, False, True, False])
b = np.array([False, True, False, True])
print(a & b) # Вывод: [False False False False]
print(a | b) # Вывод: [ True True True True]
print(a ^ b) # Вывод: [ True True True True]
print(~a) # Вывод: [False True False True]
Транслирование (Broadcasting) в NumPy
Что такое транслирование и зачем оно нужно?
Транслирование — это механизм, позволяющий NumPy выполнять арифметические операции над массивами разной формы. Он автоматически расширяет меньший массив до формы большего, чтобы соответствовать размерностям.
Правила транслирования
- Если массивы имеют разное количество измерений, форма массива с меньшим количеством измерений дополняется единицами слева.
- Если форма массивов не совпадает в каком-то измерении, массив с формой 1 в этом измерении расширяется до соответствия форме другого массива.
- Если в каком-либо измерении размеры не совпадают и ни один из них не равен 1, возникает ошибка.
Примеры использования транслирования
import numpy as np
a = np.array([1, 2, 3])
b = 5
print(a + b) # Вывод: [6 7 8]
c = np.array([[1, 2, 3], [4, 5, 6]])
d = np.array([10, 20, 30])
print(c + d)
# Вывод:
# [[11 22 33]
# [14 25 36]]
Линейная алгебра с NumPy
Умножение матриц (dot product)
import numpy as np
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
print(np.dot(a, b))
# Вывод:
# [[19 22]
# [43 50]]
Транспонирование матриц
import numpy as np
a = np.array([[1, 2], [3, 4]])
print(a.T)
# Вывод:
# [[1 3]
# [2 4]]
Вычисление определителя матрицы
import numpy as np
a = np.array([[1, 2], [3, 4]])
print(np.linalg.det(a)) # Вывод: -2.0
Решение систем линейных уравнений
import numpy as np
a = np.array([[2, 1], [1, 3]])
b = np.array([1, 2])
x = np.linalg.solve(a, b)
print(x) # Вывод: [0.2 0.6]
Вычисление собственных значений и собственных векторов
import numpy as np
a = np.array([[1, 2], [2, 1]])
w, v = np.linalg.eig(a)
print("Собственные значения:", w) # Вывод: [ 3. -1.]
print("Собственные векторы:\n", v)
# Вывод:
# [[ 0.707 -0.707]
# [ 0.707 0.707]]
Маскирование массивов NumPy
Создание масок на основе логических условий
import numpy as np
a = np.array([1, 2, 3, 4, 5])
mask = a > 2
print(mask) # Вывод: [False False True True True]
Использование масок для фильтрации данных
import numpy as np
a = np.array([1, 2, 3, 4, 5])
mask = a > 2
filtered_array = a[mask]
print(filtered_array) # Вывод: [3 4 5]
Применение масок для изменения значений массива
import numpy as np
a = np.array([1, 2, 3, 4, 5])
mask = a > 2
a[mask] = 0
print(a) # Вывод: [1 2 0 0 0]
Работа с файлами: чтение и запись массивов NumPy
Сохранение массивов в файлы (np.save, np.savez)
import numpy as np
a = np.array([1, 2, 3, 4, 5])
# Сохранение одного массива в файл
np.save('my_array.npy', a)
# Сохранение нескольких массивов в один файл
b = np.array([6, 7, 8, 9, 10])
np.savez('my_arrays.npz', array1=a, array2=b)
Чтение массивов из файлов (np.load)
import numpy as np
# Чтение одного массива из файла
loaded_array = np.load('my_array.npy')
print(loaded_array) # Вывод: [1 2 3 4 5]
# Чтение нескольких массивов из файла
loaded_arrays = np.load('my_arrays.npz')
print(loaded_arrays['array1']) # Вывод: [1 2 3 4 5]
print(loaded_arrays['array2']) # Вывод: [ 6 7 8 9 10]
Работа с текстовыми файлами (np.loadtxt, np.savetxt)
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6]])
# Сохранение массива в текстовый файл
np.savetxt('my_array.txt', a, delimiter=',')
# Чтение массива из текстового файла
loaded_array = np.loadtxt('my_array.txt', delimiter=',')
print(loaded_array)
# Вывод:
# [[1. 2. 3.]
# [4. 5. 6.]]
Векторизация: повышение производительности кода с NumPy
Что такое векторизация и почему она важна?
Векторизация — это процесс замены явных циклов в коде на операции с массивами NumPy. Векторизованный код обычно работает значительно быстрее, чем код с циклами, потому что NumPy использует оптимизированные C-реализации для выполнения операций над массивами.
Использование универсальных функций (ufuncs) для векторизации
Универсальные функции (ufuncs) — это функции, которые выполняют поэлементные операции над массивами. Они векторизованы и поэтому работают очень быстро.
import numpy as np
a = np.arange(1000000)
# Невекторизованный код (очень медленный)
import time
t1 = time.time()
result = []
for i in a:
result.append(i*2)
t2 = time.time()
print(f'Время выполнения цикла for: {t2-t1}')
# Векторизованный код (очень быстрый)
t1 = time.time()
result = a * 2
t2 = time.time()
print(f'Время выполнения векторизованной операции: {t2-t1}')
Избегание циклов Python в пользу векторизованных операций
Старайтесь избегать циклов Python при работе с массивами NumPy. Вместо этого используйте векторизованные операции, такие как универсальные функции, срезы и маскирование.
Примеры использования NumPy в задачах анализа данных
Вычисление статистических характеристик набора данных
Предположим, у вас есть данные о просмотрах рекламного баннера в течение дня. Вы можете использовать NumPy для вычисления среднего количества просмотров, стандартного отклонения и других статистических характеристик:
import numpy as np
# Данные о просмотрах баннера
views = np.array([100, 150, 120, 180, 200, 130, 110, 160, 140, 190])
# Вычисление среднего количества просмотров
mean_views = np.mean(views)
print("Среднее количество просмотров:", mean_views)
# Вычисление стандартного отклонения
std_views = np.std(views)
print("Стандартное отклонение:", std_views)
# Вычисление медианы
median_views = np.median(views)
print("Медиана:", median_views)
Фильтрация и очистка данных
Например, у вас есть данные о кликах по рекламным объявлениям, и вам нужно отфильтровать только те клики, которые были сделаны пользователями из определенной страны:
import numpy as np
# Данные о кликах
clicks = np.array([
{"user_id": 1, "country": "US", "ad_id": 123},
{"user_id": 2, "country": "CA", "ad_id": 456},
{"user_id": 3, "country": "US", "ad_id": 789},
{"user_id": 4, "country": "GB", "ad_id": 123},
{"user_id": 5, "country": "US", "ad_id": 456}
])
# Предположим, что данные хранятся в виде структуры данных, которую нужно преобразовать
# Преобразуем данные в массив NumPy структурированного типа
dtype = np.dtype([('user_id', int), ('country', 'U2'), ('ad_id', int)])
clicks_array = np.array([(click['user_id'], click['country'], click['ad_id']) for click in clicks], dtype=dtype)
# Фильтрация кликов из США
us_clicks = clicks_array[clicks_array['country'] == 'US']
print(us_clicks)
Преобразование данных для машинного обучения
NumPy широко используется для предобработки данных перед обучением моделей машинного обучения. Например, можно нормализовать данные, чтобы все признаки имели одинаковый масштаб:
import numpy as np
# Данные о характеристиках пользователей
user_features = np.array([[1000, 25, 1], [2000, 30, 0], [1500, 28, 1]])
# Нормализация данных
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
normalized_features = scaler.fit_transform(user_features)
print(normalized_features)
Заключение
Преимущества использования NumPy
NumPy — это незаменимый инструмент для работы с массивами данных в Python. Он предоставляет высокую производительность, удобный интерфейс и широкий набор функций для выполнения математических, статистических и логических операций. NumPy является основой для многих других библиотек, используемых в анализе данных, машинном обучении и других областях.
Ресурсы для дальнейшего изучения NumPy
- Официальная документация NumPy: https://numpy.org/doc/
- SciPy Lecture Notes: https://scipy-lectures.org/
- NumPy Tutorial: https://www.tutorialspoint.com/numpy/index.htm