28. (П13) Практичні завдання з індексації та broadcasting¶
Передумови¶
- Прочитана Лекція 27 — Індексація, slicing та broadcasting у NumPy
- Виконана Практична 12 — створення масивів ndarray
- Встановлений NumPy:
pip install numpy
Мова в коді
Усі рядкові літерали, вивід print(), імена файлів та змінних — лише латиницею. Кирилиця допускається тільки в коментарях.
Завдання¶
Написати скрипт indexing_broadcasting.py, у якому кожне завдання нижче виводить свій результат. Перед кожним завданням вивести заголовок, наприклад --- Task 3 ---.
Цикли for / while для обчислень не використовувати — лише індексація, маски та операції над масивами.
Персоналізація¶
STUDENT_NAME = "Ivan Petrenko" # ваше ім'я та прізвище транслітерацією
STUDENT_GROUP = "KI-31" # ваша група
N = 7 # ваш номер у списку групи + 5
Перший рядок виводу: Ivan Petrenko, KI-31, N = 7.
Усі приклади виводу нижче наведені для N = 7. У вас числа будуть іншими — це нормально.
Завдання 1. Індексація одновимірного масиву¶
Створити масив data із N чисел, що починаються з 10: np.arange(10, 10 + N).
Вивести:
- сам масив;
- в одному рядку через кому: перший елемент, останній, третій з кінця та елемент з індексом
N // 2; - записати
0у перший елемент і вивести масив ще раз.
Завдання 2. Зрізи¶
Із масиву data (уже зміненого в завданні 1) вивести п'ять зрізів, кожен з нового рядка:
- перші три елементи;
- останні три елементи;
- кожен другий елемент;
- масив у зворотному порядку;
- усі елементи, крім першого й останнього.
Завдання 3. Перегляд і копія¶
Зріз масиву — це перегляд (view): він ділить дані з оригіналом. Переконайтеся в цьому самостійно.
- Створити
view = data[:3]іcopy = data[:3].copy(). - Записати
-100у нульовий елементview. - Вивести
data,viewіcopy(по одному рядку, з підписамиdata:,view:,copy:). - Вивести результати перевірок
view.base is dataтаcopy.base is None. - У коментарі в коді пояснити одним реченням, чому
dataзмінився, аcopy— ні.
Завдання 4. Матриця: індексація та зрізи¶
Створити таблицю table з чисел від 1 до 20 формою (4, 5) і вивести її. Далі вивести:
- елемент у рядку
2, стовпці3— одним індексом через кому, а неtable[2][3]; - другий рядок цілком;
- третій стовпець цілком;
- підтаблицю з рядків
1–2та стовпців2–4; - останній рядок у зворотному порядку.
[[ 1 2 3 4 5]
[ 6 7 8 9 10]
[11 12 13 14 15]
[16 17 18 19 20]]
14
[ 6 7 8 9 10]
[ 3 8 13 18]
[[ 8 9 10]
[13 14 15]]
[20 19 18 17 16]
Завдання 5. Запис через зріз: рамка¶
Присвоювати значення можна не тільки одному елементу, а й цілому зрізу. Скористайтеся цим, щоб намалювати рамку.
- Створити масив нулів
frameформою(5, 5)цілого типу. - Записати
1у перший рядок, останній рядок, перший стовпець і останній стовпець — чотирма присвоєннями зрізам, без циклів і без перелічування елементів. - Записати
Nу центральний елемент. - Вивести результат.
Завдання 6. Булева маска¶
Придумайте середню температуру для кожного з 12 місяців — дробові числа, серед яких мають бути і від'ємні. Створіть із них масив temps через np.array([...]).
Вважаємо теплим місяць, у якому температура вища за N. Вивести:
- маску теплих місяців — масив із
TrueіFalse; - самі температури теплих місяців;
- кількість теплих місяців (через
.sum()від маски, без циклу); - середню температуру серед теплих місяців;
- номери теплих місяців — через
np.where(mask)[0].
Приклад для temps = [-3.5, -1.0, 4.5, 11.0, 17.5, 22.0, 24.5, 23.0, 18.0, 11.5, 5.0, -0.5] і N = 7:
[False False False True True True True True True True False False]
[11. 17.5 22. 24.5 23. 18. 11.5]
7
18.214285714285715
[3 4 5 6 7 8 9]
Завдання 7. Комбіновані умови та np.where¶
Працюємо з тим самим масивом temps.
- Вивести температури, які потрапляють у діапазон від
Nдо2 * Nвключно — одна умова з&і дужками. - Вивести температури, які не потрапили в цей діапазон — через
~від тієї самої маски. - Побудувати масив підписів:
"warm"там, де температура вища заN, і"cold"в інших місцях — черезnp.whereіз трьома аргументами. - Побудувати масив, у якому всі від'ємні температури замінені на
0.0, а решта лишилася без змін.
[11. 11.5]
[-3.5 -1. 4.5 17.5 22. 24.5 23. 18. 5. -0.5]
['cold' 'cold' 'cold' 'warm' 'warm' 'warm' 'warm' 'warm' 'warm' 'warm'
'cold' 'cold']
[ 0. 0. 4.5 11. 17.5 22. 24.5 23. 18. 11.5 5. 0. ]
Знайшли помилку чи бажаєте додати інформацію, щоб покращити курс? Створіть issue на GitHub