Создание и операции с массивами в NumPy

Давайте рассмотрим создание и основные операции с массивами в библиотеке NumPy более подробно. Это даст вам хорошее представление о том, как работать с массивами и использовать их возможности для вычислений.

Создание массивов

Создание из списка

Самый простой способ создать массив NumPy — это преобразовать существующий список или список списков в массив.

import numpy as np

# Одномерный массив
a = np.array([1, 2, 3, 4, 5])

# Двумерный массив
b = np.array([[1, 2, 3], [4, 5, 6]])

Использование специальных функций

NumPy предоставляет несколько функций для создания массивов с определенными значениями:

  • np.zeros(shape): Создает массив, заполненный нулями.

  • np.ones(shape): Создает массив, заполненный единицами.

  • np.full(shape, fill_value): Создает массив, заполненный указанным значением.

  • np.eye(N): Создает единичную матрицу размером ( N \times N ).

  • np.arange(start, stop, step): Создает массив с диапазоном значений, аналогично функции range.

  • np.linspace(start, stop, num): Создает массив с равномерным распределением значений от start до stop, содержащий num элементов.

# Массив из нулей
zeros = np.zeros((2, 3))    # array([[0., 0., 0.], [0., 0., 0.]])
  
# Массив из единиц
ones = np.ones((3, 4))      # array([[1., 1., 1., 1.], [1., 1., 1., 1.], [1., 1., 1., 1.]])
  
# Массив, заполненный конкретным значением
full = np.full((2, 2), 7)   # array([[7, 7], [7, 7]])

# Единичная матрица
identity = np.eye(3)        # array([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]])
  
# Массив от 0 до 9
arange = np.arange(10)      # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

# Массив от 0 до 1 с 5 элементами
linspace = np.linspace(0, 1, 5)  # array([0. , 0.25, 0.5 , 0.75, 1. ])

Создание случайных массивов

Для генерации случайных данных NumPy предлагает модуль np.random:

  • np.random.random(size): Генерирует массив случайных чисел от 0 до 1.

  • np.random.randint(low, high, size): Генерирует массив случайных целых чисел в заданном диапазоне.

  • np.random.normal(loc, scale, size): Генерирует массив случайных чисел с нормальным распределением.

# Случайные числа от 0 до 1
random_array = np.random.random((2, 3))  # array([[0.80036454, 0.63254594, 0.33255652], [0.25810912, 0.89598151, 0.56806594]])

# Случайные целые числа от 0 до 10
random_integers = np.random.randint(0, 10, (3, 3))  # array([[5, 3, 7], [1, 6, 8], [2, 4, 3]])

# Случайные числа с нормальным распределением
normal_dist = np.random.normal(0, 1, (2, 2))  # array([[ 0.76382391, -0.39345307], [ 0.22292759,  0.37701458]])

Основные операции с массивами

Арифметические операции

Арифметические операции выполняются поэлементно. Это означает, что каждая операция выполняется над соответствующими элементами двух массивов, или массив может быть выполнен с одним скалярным значением.

a = np.array([1, 2, 3, 4])
b = np.array([5, 6, 7, 8])

# Сложение
sum_ab = a + b  # array([ 6,  8, 10, 12])

# Вычитание
diff_ab = a - b  # array([-4, -4, -4, -4])

# Умножение
prod_ab = a * b  # array([ 5, 12, 21, 32])

# Деление
div_ab = a / b  # array([0.2       , 0.33333333, 0.42857143, 0.5       ])

# Возведение в степень
power_ab = a ** 2  # array([ 1,  4,  9, 16])

Универсальные функции (ufunc)

Универсальные функции применяются поэлементно и включают математические операции, такие как синус, экспонента и т.д.

a = np.array([1, 2, 3, 4])

# Синус
sin_a = np.sin(a)  # array([0.84147098, 0.90929743, 0.14112001, -0.7568025 ])

# Экспонента
exp_a = np.exp(a)  # array([ 2.71828183,  7.3890561 , 20.08553692, 54.59815003])

# Логарифм
log_a = np.log(a)  # array([0.        , 0.69314718, 1.09861229, 1.38629436])

Операции над многомерными массивами

Работа с многомерными массивами (матрицами) поддерживает такие операции, как сложение, умножение, транспонирование и вычисление суммы по осям.

# Создание матриц
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])

# Сложение матриц
C = A + B  # array([[ 6,  8], [10, 12]])

# Умножение матриц
D = np.dot(A, B)  # array([[19, 22], [43, 50]])

# Транспонирование
E = A.T  # array([[1, 3], [2, 4]])

# Сложение по осям
sum_axis0 = np.sum(A, axis=0)  # array([4, 6])  # Сумма по строкам (по каждому столбцу)
sum_axis1 = np.sum(A, axis=1)  # array([3, 7])  # Сумма по столбцам (по каждой строке)

Индексация и срезы

Индексация и срезы позволяют извлекать элементы и подмассивы из массивов.

# Одномерный массив
a = np.array([10, 20, 30, 40, 50])

# Индексация
element = a[2]  # 30

# Срезы
slice_a = a[1:4]  # array([20, 30, 40])

# Двумерный массив
b = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# Доступ к элементу
element = b[1, 2]  # 6

# Вся вторая строка
row = b[1, :]  # array([4, 5, 6])

# Весь третий столбец
column = b[:, 2]  # array([3, 6, 9])

Прочие полезные функции

Изменение формы массива

Функции для изменения формы массива без изменения данных:

a = np.array([1, 2, 3, 4, 5, 6])

# Изменение формы на 2x3
reshaped_a = a.reshape((2, 3))  # array([[1, 2, 3], [4, 5, 6]])

Объединение и разделение массивов

Функции для объединения и разделения массивов:

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

# Объединение массивов
concat_ab = np.concatenate((a, b))

  # array([1, 2, 3, 4, 5, 6])

# Разделение массива
split_ab = np.split(concat_ab, 2)  # [array([1, 2, 3]), array([4, 5, 6])]

Математические операции

Включает операции таких функций, как среднее, медиана, стандартное отклонение:

a = np.array([1, 2, 3, 4, 5])

# Среднее значение
mean_a = np.mean(a)  # 3.0

# Медиана
median_a = np.median(a)  # 3.0

# Стандартное отклонение
std_a = np.std(a)  # 1.4142135623730951

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

Last updated