NumPy: Полное руководство по библиотеке для работы с массивами данных в Python

Введение в 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. Если массивы имеют разное количество измерений, форма массива с меньшим количеством измерений дополняется единицами слева.
  2. Если форма массивов не совпадает в каком-то измерении, массив с формой 1 в этом измерении расширяется до соответствия форме другого массива.
  3. Если в каком-либо измерении размеры не совпадают и ни один из них не равен 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


Добавить комментарий