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


```python
# ЗАДАНИЕ 1
import math

r = float(input("Введите радиус: "))
C = 2 * math.pi * r
S = math.pi * r**2
V = (4/3) * math.pi * r**3
print(f"Длина окружности: {round(C, 2)}")
print(f"Площадь круга: {round(S, 2)}")
print(f"Объем шара: {round(V, 2)}")
```

```python
# ЗАДАНИЕ 2
import math

deg = float(input("Введите угол в градусах: "))
rad = math.radians(deg)
sin_val = math.sin(rad)
cos_val = math.cos(rad)
tan_val = math.tan(rad)
print(f"Угол в радианах: {rad:.4f}")
print(f"sin({deg:.0f}°) = {sin_val:.4f}")
print(f"cos({deg:.0f}°) = {cos_val:.4f}")
print(f"tan({deg:.0f}°) = {tan_val:.4f}")
restored_rad = math.asin(sin_val)
restored_deg = math.degrees(restored_rad)
print(f"Восстановленный угол: {restored_deg:.1f}°")
```

```python
# ЗАДАНИЕ 3
import math

x1 = float(input("Введите x1: "))
y1 = float(input("Введите y1: "))
x2 = float(input("Введите x2: "))
y2 = float(input("Введите y2: "))
dist_math = math.dist((x1, y1), (x2, y2))
dist_formula = math.sqrt((x2-x1)**2 + (y2-y1)**2)
print(f"Расстояние через math.dist: {dist_math}")
print(f"Расстояние по формуле: {dist_formula}")
if math.isclose(dist_math, dist_formula):
    print("Результаты совпадают!")
else:
    print("Результаты не совпадают!")
```

```python
# ЗАДАНИЕ 4
import numpy as np

a = np.array([10, 20, 30, 40, 50])
b = np.zeros(10)
c = np.ones(8)
d = np.arange(0, 21, 2)
e = np.linspace(0, 1, 5)

print(f"Массив a: {a}, dtype: {a.dtype}")
print(f"Массив b: {b}, dtype: {b.dtype}")
print(f"Массив c: {c}, dtype: {c.dtype}")
print(f"Массив d: {d}, dtype: {d.dtype}")
print(f"Массив e: {e}, dtype: {e.dtype}")
```

```python
# ЗАДАНИЕ 5
import numpy as np

matrix = np.arange(1, 13).reshape(3, 4)
print("Массив:")
print(matrix)
print(f"Размерность: {matrix.ndim}")
print(f"Форма: {matrix.shape}")
print(f"Всего элементов: {matrix.size}")
print(f"Тип данных: {matrix.dtype}")
```

```python
# ЗАДАНИЕ 6
import numpy as np

arr1 = np.array([2, 4, 6, 8, 10])
arr2 = np.array([1, 3, 5, 7, 9])

print(f"arr1 + arr2 = {arr1 + arr2}")
print(f"arr1 * arr2 = {arr1 * arr2}")
print(f"arr1 / arr2 = {arr1 / arr2}")
print(f"arr1^2 = {arr1**2}")
print(f"Сумма arr1: {arr1.sum()}")
print(f"Максимум arr2: {arr2.max()}")
```

```python
# ЗАДАНИЕ 7
import numpy as np

arr = np.arange(10, 100, 10)
print(f"Исходный массив: {arr}")
print(f"Первые 3: {arr[:3]}")
print(f"С 3-го по 6-й: {arr[2:6]}")
print(f"Последние 2: {arr[-2:]}")
print(f"Каждый второй: {arr[::2]}")
print(f"В обратном порядке: {arr[::-1]}")
```

```python
# ЗАДАНИЕ 8
import numpy as np

arr = np.arange(1, 13)
print(f"Исходный массив: {arr}")
print("\n3x4:")
print(arr.reshape(3, 4))
print("\n4x3:")
print(arr.reshape(4, 3))
print("\n2x6:")
print(arr.reshape(2, 6))
print("\nreshape(2, -1):")
print(arr.reshape(2, -1))
```

```python
# ЗАДАНИЕ 9
import numpy as np

M = np.array([[2, 4, 6], [1, 3, 5], [8, 10, 12]])
print("Матрица M:")
print(M)
print(f"Общая сумма: {M.sum()}")
print(f"Сумма по столбцам: {M.sum(axis=0)}")
print(f"Сумма по строкам: {M.sum(axis=1)}")
print(f"Минимумы по столбцам: {M.min(axis=0)}")
print(f"Максимумы по строкам: {M.max(axis=1)}")
```

```python
# ЗАДАНИЕ 10
import numpy as np

M = np.arange(1, 17).reshape(4, 4)
print("Исходная матрица:")
print(M)
print(f"Вторая строка: {M[1]}")
print(f"Третий столбец: {M[:, 2]}")
print(f"Элемент [1, 2]: {M[1, 2]}")
print("\nПодматрица 2x2:")
print(M[:2, :2])
M[-1] = 0
print("\nМатрица после изменения последней строки:")
print(M)
```
Ответы на контрольные вопросы (от студента):

1. Модуль math – встроенная библиотека Python для работы с отдельными числами (скалярами). Используется для тригонометрических, логарифмических, степенных и комбинаторных вычислений. Группы функций:
   · округления и представления (floor, ceil, trunc);
   · степенные и логарифмические (pow, sqrt, exp, log);
   · тригонометрические и обратные (sin, cos, tan, asin, acos, atan);
   · гиперболические;
   · специальные (gamma, erf);
   · константы (pi, e).
2. Главное отличие ndarray от списка: массив гомогенен (все элементы одного типа), имеет фиксированный размер и хранится в памяти непрерывно, что даёт высокую скорость операций. Список может содержать любые объекты и изменяемый размер.
3. Форма (shape) – кортеж, указывающий размер массива по каждому измерению. Изменить можно методами:
   · reshape(new_shape) – возвращает новый массив с новой формой (количество элементов должно совпадать);
   · resize(new_shape) – изменяет сам массив (может менять размер);
   · Можно использовать -1 в reshape, чтобы автоматически вычислить размерность.
4. Векторизация – применение операции ко всем элементам массива без явных циклов Python, благодаря чему вычисления выполняются в скомпилированном коде на C/Fortran. Это даёт значительный выигрыш в производительности (в 10–100 раз) по сравнению с поэлементной обработкой в циклах Python.
5. Матричное умножение в NumPy выполняется:
   · оператором @ (например, A @ B);
   · функцией np.dot(A, B).
     Для поэлементного умножения используется *.
6. Агрегатные функции: sum(), min(), max(), mean(), std() и др. Ось указывается параметром axis:
   · axis=0 – вычисления по столбцам (вертикально);
   · axis=1 – по строкам (горизонтально).
        Если ось не указана, вычисления идут по всем элементам.
7. Линеаризация – преобразование многомерного массива в одномерную последовательность (или итерация по всем элементам подряд). Доступ к элементам последовательно можно получить через свойство flat:
   ```python
   for el in array.flat:
       print(el)
   ```
   Также можно использовать ravel() или flatten() для создания копии-одномерного массива.
8. При создании массива с dtype="uint8" (беззнаковый 8-битный, диапазон 0–255) и записи числа 300 произойдёт переполнение – значение «зациклится» по модулю 256, т.е. 300 % 256 = 44. В итоге в массиве будет число 44, ошибки не возникнет (если не включена проверка переполнения).