Загрузка данных


ЛАБОРАТОРНАЯ РАБОТА № 10
Математические вычисления в Python: модули math и numpy
Дисциплина: Основы алгоритмизации и программирования
Специальность: 09.02.07 «Информационные системы и программирование»
Студент:Леха Климов и Киселёв Теми Группа:22 ИСР
Преподаватель: Елисеева

ЦЕЛЬ:
формирование практических навыков использования библиотек math и numpy в языке программирования Python для решения математических задач: выполнение стандартных математических вычислений, создание и обработка массивов, выполнение операций над ними, сравнение производительности.

ЗАДАЧИ:
1.	Изучить основные функции стандартного модуля math.
2.	Освоить создание массивов numpy из списков и с помощью встроенных функций.
3.	Научиться работать с атрибутами массивов ndarray (форма, размерность, тип данных).
4.	Освоить операции индексации, срезов и изменения формы массивов.
5.	Изучить выполнение поэлементных операций и матричного умножения.
6.	Применить агрегатные функции для обработки данных в массивах.
7.	Выполнить индивидуальные задания для самостоятельного решения.

ТЕОРЕТИЧЕСКАЯ ЧАСТЬ (ПОДРОБНОЕ ИЗЛОЖЕНИЕ)
1. Введение в модули math и numpy
Python является интерпретируемым языком, что делает его медленнее компилируемых (например, C++). Однако он широко используется в науке о данных и машинном обучении благодаря специализированным библиотекам, которые написаны на высокопроизводительных языках (C, Fortran). Ключевыми библиотеками для математических вычислений являются math и numpy.

Модуль math входит в стандартную библиотеку Python и предоставляет функции для работы с отдельными числами: тригонометрические, логарифмические, степенные функции, а также константы (pi, e) и функции комбинаторики.

Библиотека numpy  — это основа для научных вычислений. Она предоставляет объект ndarray (многомерный массив), который позволяет эффективно хранить и обрабатывать большие объемы числовых данных. Операции над массивами numpy выполняются значительно быстрее, чем аналогичные операции со списками Python.

2. Обзор модуля math
Модуль math предоставляет широкий спектр математических функций, которые можно разделить на несколько групп.

2.1. Функции теории чисел и представления
Эти функции полезны для комбинаторики и работы с целыми числами.
	math.comb(n, k): число сочетаний из n по k (количество способов выбрать k элементов из n без учета порядка).
o	import math
o	print(math.comb(12, 3))  # 220
	math.factorial(x): факториал числа x (произведение чисел от 1 до x).
o	print(math.factorial(5))  # 120
	math.gcd(*integers): наибольший общий делитель (НОД) для всех переданных чисел.
o	print(math.gcd(120, 210, 360))  # 30
	math.lcm(*integers): наименьшее общее кратное (НОК). Появилась в Python 3.9.
o	print(math.lcm(10, 20, 30, 40))  # 120
	math.perm(n, k=None): число размещений из n по k (порядок важен). Если k не указано, возвращает n!.
o	print(math.perm(4, 2))  # 12
o	print(math.perm(4))     # 24
	math.prod(iterable, start=1): перемножает все элементы итерируемого объекта.
o	print(math.prod(range(1, 6)))  # 120

2.2. Степенные и логарифмические функции
	math.exp(x): возвращает ex.
	math.log(x, base): логарифм x по основанию base. Если base не указан, вычисляется натуральный логарифм (по основанию e).
	math.pow(x, y): возвращает x в степени y, оба аргумента преобразуются в float.

2.3. Тригонометрические и специальные функции
Все тригонометрические функции работают с углами в радианах.
	math.sin(x), math.cos(x), math.tan(x): стандартные тригонометрические функции.
	math.asin(x), math.acos(x), math.atan(x): обратные тригонометрические функции.
	math.dist(p, q): евклидово расстояние между точками p и q.
	math.hypot(*coordinates): длина вектора от начала координат.
	math.degrees(x), math.radians(x): преобразование между радианами и градусами.
	math.gamma(x): гамма-функция, обобщение факториала на вещественные числа.
	math.pi, math.e: математические константы.

3. Основы работы с numpy
Библиотека numpy не входит в стандартную поставку Python. Для ее установки используется команда:
pip install numpy

После установки ее принято импортировать под псевдонимом np.
import numpy as np

3.1. Массивы ndarray
Центральный объект библиотеки — numpy.ndarray (N-dimensional array), который представляет собой многомерный массив. В отличие от списков Python, массивы numpy обладают следующими ключевыми свойствами:
1.	Гомогенность: все элементы имеют один и тот же тип данных (dtype).
2.	Фиксированный размер: размер массива задается при создании.
3.	Эффективность: данные хранятся непрерывно в памяти, что обеспечивает высокую производительность.
Массивы могут быть одномерными (векторы), двумерными (матрицы) и многомерными (тензоры).
Создание массива из списка:
a = np.array([1, 2, 3, 4])          # одномерный массив
b = np.array([[1, 2], [3, 4]])      # двумерный массив

3.2. Атрибуты массива ndarray
	ndarray.ndim: количество измерений (осей).
	ndarray.shape: кортеж, содержащий размер каждого измерения. Например, для матрицы из 4 строк и 2 столбцов shape = (4, 2).
	ndarray.size: общее количество элементов.
	ndarray.dtype: тип данных элементов (например, int32, float64).
	ndarray.itemsize: размер одного элемента в байтах.

Пример:
a = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
print(a.ndim)   # 2
print(a.shape)  # (4, 2)
print(a.size)   # 8
print(a.dtype)  # int32

3.3. Типы данных (dtype)
Типы данных в numpy тесно связаны с типами в языке C. Важно помнить об ограничениях диапазона значений.
	int8, int16, int32, int64: целые числа со знаком.
	uint8, uint16, uint32, uint64: целые числа без знака.
	float32, float64: числа с плавающей точкой.
	bool: булевы значения.
	str: строки.
При переполнении происходит "зацикливание" значений по модулю.
a = np.array([1, 2, 3], dtype="uint8")
a[0] = 256  # 256 выходит за пределы 0-255
print(a)    # [0 2 3]
Если тип не указан, numpy пытается определить его автоматически.

4. Создание, изменение и обработка массивов
4.1. Создание массивов
	np.zeros(shape, dtype=float): массив, заполненный нулями.
	np.ones(shape, dtype=float): массив, заполненный единицами.
	np.eye(N, dtype=float): единичная матрица размера NxN.
	np.arange([start], stop, [step], dtype=None): массив с арифметической прогрессией, аналог range().
	np.linspace(start, stop, num): массив из num равномерно распределенных значений на отрезке [start, stop].

4.2. Изменение формы
	reshape(new_shape): возвращает новый массив с измененной формой. Общее количество элементов должно совпадать.
	resize(new_shape): изменяет форму исходного массива.
	-1 в качестве одного из измерений reshape позволяет автоматически вычислить его размер.
a = np.arange(12).reshape(3, 4)   # Матрица 3x4
b = a.reshape(2, -1)              # Матрица 2x6, -1 вычисляется как 12/2 = 6

4.3. Операции над массивами
	Поэлементные операции: +, -, *, /, ** работают с каждым элементом массива.
	Матричное умножение: @ или np.dot().
	Транспонирование: transpose() или .T.
	Поворот: np.rot90().

4.4. Агрегатные функции
	sum(), min(), max(), mean(), std(): работают со всем массивом или по указанной оси (axis).
	axis=0 — операции по столбцам (вертикальная агрегация).
	axis=1 — операции по строкам (горизонтальная агрегация).

4.5. Индексация и срезы
Индексация и срезы в numpy работают аналогично спискам, но поддерживают многомерность.
a = np.arange(12).reshape(3, 4)
print(a[1, 2])       # Элемент во 2-й строке, 3-м столбце (индексация с 0)
print(a[:2, 1:3])    # Срез: первые 2 строки, столбцы с 1 по 3 (не включая 3)
print(a[:, ::2])     # Все строки, каждый второй столбец

4.6. Линеаризация
Для итерации по всем элементам многомерного массива можно использовать свойство flat.
a = np.arange(12).reshape(3, 4)
for el in a.flat:
    print(el, end=" ")

5. Преимущества numpy в производительности
Ключевое преимущество numpy — это векторизация. Операции применяются ко всем элементам массива без явных циклов Python, что позволяет использовать высокопроизводительный код на C.
В следующем примере вычисление суммы квадратных корней из 10 миллионов чисел с помощью numpy выполняется примерно в 30 раз быстрее, чем с использованием стандартного генератора и цикла:
sum(x ** 0.5 for x in range(10**7))  # ~1.78 секунды
np.sqrt(np.arange(10**7)).sum()      # ~0.05 секунды

КОНТРОЛЬНЫЕ ВОПРОСЫ
1.	Что такое модуль math и для каких целей он используется? Какие группы функций в нем есть? Ответ: 
•	Модуль math — это встроенный модуль Python, который предоставляет доступ к математическим функцим, реализованным на уровне базовой библиотеки языка C.
•	Цель использования: Он предназначен для выполнения математических операций над скалярами (одиночными числами), а не над массивами данных.
•	Основные группы функций:
Функции округления и представления: 
•	floor() (округление вниз), ceil() (округление вверх), trunc() (отбрасывание дробной части).
•	Степенные и логарифмические функции: pow(), sqrt() (квадратный корень), exp(), log(), log10(), log2().
•	Тригонометрические функции: sin(), cos(), tan(), asin(), acos(), atan(), hypot() (вычисление гипотенузы).
•	Гиперболические функции: sinh(), cosh(), tanh().
•	Преобразование углов: degrees() (из радиан в градусы), radians() (из градусов в радианы).
•	Специальные функции: gamma(), erf() (функция ошибок) и др.
•	Математические константы: math.pi (ππ), math.e (ee), math.inf (бесконечность), math.nan (не число).
2.	В чем главное отличие массива numpy.ndarray от обычного списка Python? Ответ:
3.	Что такое форма (shape) массива и как ее можно изменить? Какие методы для этого существуют? Ответ:
4.	Что такое векторизация и почему операции с массивами numpy выполняются быстрее, чем аналогичные операции со списками? Ответ:
5.	Как выполнить матричное умножение в numpy? Ответ:
6.	Какие агрегатные функции (sum, min, max) в numpy вы знаете и как указать ось для их вычисления? Ответ:
7.	Что такое линеаризация массива и как получить доступ ко всем его элементам последовательно? Ответ:
8. Что произойдет, если создать массив np.array([1, 2, 3], dtype="uint8") и попытаться записать в                                              него число 300? Ответ:


САМОСТОЯТЕЛЬНЫЕ ЗАДАНИЯ
Общие требования:
	Для каждого задания напишите программу на Python.
	Используйте import math и import numpy as np.
	Включите в отчет листинг программы и скриншоты результатов выполнения для тестовых данных.

ЗАДАНИЕ 1 (МОДУЛЬ MATH: БАЗОВЫЕ ВЫЧИСЛЕНИЯ)
Напишите программу, которая запрашивает у пользователя радиус окружности (число с плавающей точкой) и вычисляет:
1.	Длину окружности по формуле C = 2 * π * r.
2.	Площадь круга по формуле S = π * r².
3.	Объем шара по формуле V = (4/3) * π * r³.
Для числа π используйте константу math.pi. Результаты выведите с точностью до 2 знаков после запятой с помощью функции round().

Пример работы:
Введите радиус: 5
Длина окружности: 31.42
Площадь круга: 78.54
Объем шара: 523.60
Установленный python: 3.13
Листинг программы:
(вставьте код)

Результат выполнения (скриншот):
(вставьте скриншот)

ЗАДАНИЕ 2 (МОДУЛЬ MATH: РАБОТА С УГЛАМИ)
Напишите программу, которая:
1.	Запрашивает у пользователя угол в градусах (число).
2.	Переводит его в радианы с помощью math.radians().
3.	Вычисляет и выводит синус, косинус и тангенс этого угла (используя math.sin(), math.cos(), math.tan()).
4.	По вычисленному значению синуса находит угол в радианах с помощью math.asin() и переводит его обратно в градусы с помощью math.degrees().
5.	Выводит восстановленный угол в градусах.
Пример работы:
Введите угол в градусах: 45
Угол в радианах: 0.7854
sin(45°) = 0.7071
cos(45°) = 0.7071
tan(45°) = 1.0000
Восстановленный угол: 45.0°

Листинг программы:
(вставьте код)

Результат выполнения (скриншот):
(вставьте скриншот)

ЗАДАНИЕ 3 (МОДУЛЬ MATH: РАССТОЯНИЕ МЕЖДУ ТОЧКАМИ)
Напишите программу, которая запрашивает у пользователя координаты двух точек на плоскости (x1, y1) и (x2, y2) и вычисляет:
1.	Расстояние между ними с помощью функции math.dist().
2.	Расстояние между ними вручную по формуле евклидова расстояния: √((x2-x1)² + (y2-y1)²) с использованием math.sqrt().
3.	Сравнивает полученные результаты (они должны быть равны).
Пример работы:
Введите x1: 0
Введите y1: 0
Введите x2: 3
Введите y2: 4
Расстояние через math.dist: 5.0
Расстояние по формуле: 5.0
Результаты совпадают!

Листинг программы:
(вставьте код)

Результат выполнения (скриншот):
(вставьте скриншот)

ЗАДАНИЕ 4 (NUMPY: СОЗДАНИЕ МАССИВОВ)
Создайте с помощью numpy следующие массивы и выведите их на экран вместе с их типом (dtype):
1.	Массив a из списка [10, 20, 30, 40, 50].
2.	Массив b из 10 нулей (используйте np.zeros()).
3.	Массив c из 8 единиц (используйте np.ones()).
4.	Массив d чисел от 0 до 20 с шагом 2 (используйте np.arange()).
5.	Массив e из 5 чисел, равномерно распределенных от 0 до 1 (используйте np.linspace()).

Пример вывода для массива a:
Массив a: [10 20 30 40 50], dtype: int32

Листинг программы:
(вставьте код)

Результат выполнения (скриншот):
(вставьте скриншот)

ЗАДАНИЕ 5 (NUMPY: АТРИБУТЫ МАССИВОВ)
Создайте двумерный массив matrix размером 3 строки на 4 столбца из чисел от 1 до 12 с помощью np.arange().reshape().
Выведите на экран:
1.	Массив matrix.
2.	Его размерность (ndim).
3.	Форму (shape).
4.	Общее количество элементов (size).
5.	Тип данных (dtype).
Пример вывода:
Массив:
[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]
Размерность: 2
Форма: (3, 4)
Всего элементов: 12
Тип данных: int32

Листинг программы:
(вставьте код)

Результат выполнения (скриншот):
(вставьте скриншот)

ЗАДАНИЕ 6 (NUMPY: ПРОСТЫЕ ОПЕРАЦИИ С МАССИВАМИ)
Даны два массива:
	arr1 = np.array([2, 4, 6, 8, 10])
	arr2 = np.array([1, 3, 5, 7, 9])
Выполните и выведите результаты следующих операций:
1.	Сложение arr1 + arr2.
2.	Умножение arr1 * arr2.
3.	Деление arr1 / arr2.
4.	Возведение arr1 в квадрат (каждый элемент умножить сам на себя).
5.	Найдите сумму всех элементов arr1 и максимальный элемент arr2.
Пример вывода:
arr1 + arr2 = [ 3  7 11 15 19]
arr1 * arr2 = [ 2 12 30 56 90]
arr1 / arr2 = [2.         1.33333333 1.2        1.14285714 1.11111111]
arr1^2 = [  4  16  36  64 100]
Сумма arr1: 30
Максимум arr2: 9

Листинг программы:
(вставьте код)

Результат выполнения (скриншот):
(вставьте скриншот)

ЗАДАНИЕ 7 (NUMPY: РАБОТА СО СРЕЗАМИ)
Создайте массив arr = np.arange(10, 100, 10), который содержит числа [10, 20, 30, 40, 50, 60, 70, 80, 90].
Выполните следующие действия и выведите результат каждого:
1.	Выведите первые 3 элемента.
2.	Выведите элементы с 3-го по 6-й (индексы с 2 по 5).
3.	Выведите последние 2 элемента.
4.	Выведите каждый второй элемент.
5.	Выведите все элементы в обратном порядке.
Пример вывода:
Исходный массив: [10 20 30 40 50 60 70 80 90]
Первые 3: [10 20 30]
С 3-го по 6-й: [30 40 50 60]
Последние 2: [80 90]
Каждый второй: [10 30 50 70 90]
В обратном порядке: [90 80 70 60 50 40 30 20 10]

Листинг программы:
(вставьте код)

Результат выполнения (скриншот):
(вставьте скриншот)

ЗАДАНИЕ 8 (NUMPY: ИЗМЕНЕНИЕ ФОРМЫ МАССИВА)
Создайте одномерный массив arr = np.arange(1, 13) (числа от 1 до 12).
1.	Выведите исходный массив.
2.	Преобразуйте его в матрицу размером 3x4 с помощью reshape() и выведите.
3.	Преобразуйте исходный массив в матрицу размером 4x3 и выведите.
4.	Преобразуйте исходный массив в матрицу размером 2x6 и выведите.
5.	Используйте reshape(2, -1), чтобы автоматически вычислить второй размер, и выведите результат.
Пример вывода:
Исходный массив: [ 1  2  3  4  5  6  7  8  9 10 11 12]

3x4:
[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]

4x3:
[[ 1  2  3]
 [ 4  5  6]
 [ 7  8  9]
 [10 11 12]]
2x6:
[[ 1  2  3  4  5  6]
 [ 7  8  9 10 11 12]]

reshape(2, -1):
[[ 1  2  3  4  5  6]
 [ 7  8  9 10 11 12]]

Листинг программы:
(вставьте код)

Результат выполнения (скриншот):
(вставьте скриншот)

ЗАДАНИЕ 9 (NUMPY: АГРЕГАТНЫЕ ФУНКЦИИ ПО СТРОКАМ И СТОЛБЦАМ)
Создайте матрицу M = np.array([[2, 4, 6], [1, 3, 5], [8, 10, 12]]).
Выполните и выведите:
1.	Сумму всех элементов матрицы.
2.	Сумму элементов по столбцам (используйте axis=0).
3.	Сумму элементов по строкам (используйте axis=1).
4.	Минимальное значение в каждом столбце.
5.	Максимальное значение в каждой строке.
Пример вывода:
Матрица M:
[[ 2  4  6]
 [ 1  3  5]
 [ 8 10 12]]
Общая сумма: 51
Сумма по столбцам: [11 17 23]
Сумма по строкам: [12  9 30]
Минимумы по столбцам: [1 3 5]
Максимумы по строкам: [6 5 12]

Листинг программы:
(вставьте код)

Результат выполнения (скриншот):
(вставьте скриншот)

ЗАДАНИЕ 10 (NUMPY: РАБОТА С ЭЛЕМЕНТАМИ МАТРИЦЫ)
Создайте матрицу M = np.arange(1, 17).reshape(4, 4) (матрица 4x4 с числами от 1 до 16).
Выполните следующие операции и выведите результаты:
1.	Выведите всю матрицу.
2.	Выведите вторую строку (индекс 1).
3.	Выведите третий столбец (индекс 2).
4.	Выведите элемент, который находится на пересечении 2-й строки и 3-го столбца (индексы [1, 2]).
5.	Выведите подматрицу, состоящую из первых двух строк и первых двух столбцов.
6.	Измените все элементы в последней строке на 0 и выведите обновленную матрицу.
Пример вывода:
Исходная матрица:
[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]
 [13 14 15 16]]
Вторая строка: [5 6 7 8]
Третий столбец: [ 3  7 11 15]
Элемент [1, 2]: 7

Подматрица 2x2:
[[1 2]
 [5 6]]

Матрица после изменения последней строки:
[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]
 [ 0  0  0  0]]

Листинг программы:
(вставьте код)

Результат выполнения (скриншот):
(вставьте скриншот)

ТРЕБОВАНИЯ К ОФОРМЛЕНИЮ ОТЧЕТА
1.	Отчёт выполняется в текстовом редакторе (MS Word или аналог).
2.	Титульный лист должен содержать: название учебного заведения, дисциплины, номер и тему работы, ФИО и группу студента, ФИО преподавателя, город и год.
3.	Обязательно наличие цели, задач и теоретической части.
4.	Для каждого задания самостоятельной работы должны быть представлены:
o	Условие задачи.
o	Листинг (текст) программы, оформленный моноширинным шрифтом (например, Courier New).
o	Скриншоты консоли с результатами выполнения программы для различных тестовых данных.
5.	В конце отчёта должны быть представлены ответы на контрольные вопросы и вывод.
________________________________________
ВЫВОДЫ
(Студент самостоятельно формулирует вывод о том, какие навыки и знания были получены в ходе выполнения работы, с какими функциями и библиотеками познакомился, какие типичные ошибки были допущены и как они исправлялись. Обязательно отметить практическую значимость изученного материала.)

Рекомендуемая структура вывода:
	Какие модули и библиотеки были изучены в ходе работы (math, numpy).
	Какие основные функции и возможности были освоены (функции math, создание массивов, атрибуты, операции, индексация).
	Какие задания вызвали наибольшие трудности и почему.
	Какие ошибки были допущены в процессе выполнения и как они были исправлены.
	Как полученные навыки можно применить на практике (научные расчеты, обработка данных, машинное обучение).
	Общая оценка результатов работы.

Отработано часов: 4
Подпись студента: _____________ Дата: ______

СПИСОК ЛИТЕРАТУРЫ
1.	Python Software Foundation. The Python Standard Library — math [Электронный ресурс]. — Режим доступа: https://docs.python.org/3/library/math.html (дата обращения: 18.06.2026).
2.	NumPy Documentation. NumPy User Guide [Электронный ресурс]. — Режим доступа: https://numpy.org/doc/stable/user/index.html (дата обращения: 18.06.2026).
3.	Yandex Education. Модули math и numpy [Электронный ресурс]. — Режим доступа: https://education.yandex.ru/handbook/python/article/moduli-math-i-numpy (дата обращения: 18.06.2026).
4.	Лутц М. Изучаем Python. — 5-е изд. — СПб.: Диалектика, 2020. — Том 1, 2.
5.	Вандер Плас Дж. Python для сложных задач: наука о данных и машинное обучение. — СПб.: Питер, 2018. — Главы 2-4 (NumPy).