Тест самоперевірки

NumPy: масиви

Обери відповідь — і одразу побачиш пояснення. Помилитись тут корисніше, ніж на іспиті.

← до лекції
Відповіді0 / 8   правильних: 0
Питання 1 / 8

Список із мільйона цілих займає 38.6 МБ, масив int64 тієї самої довжини — 7.63 МБ. Що є головною причиною різниці?

Чому так. У списку кожна комірка — це 8 байтів адреси, а за нею живе окремий обʼєкт-число зі своїм заголовком і лічильником посилань. Масив не тримає обʼєктів узагалі: один суцільний блок, по 8 байтів на число. Точність при цьому та сама: int64 вміщує рівно ті самі значення. Резерв під append у списку теж є, але він додає відсотки, а не кратність.
Питання 2 / 8

Виконали: тиждень = np.array([180, 195, 175, 205]); частина = тиждень[1:3]; частина[0] = 0. Що покаже print(тиждень)?

Чому так. Зріз масиву — це вигляд (view) на ту саму памʼять, а не копія. Нульовий елемент вигляду фізично лежить там, де в оригіналі номер 1, тому запис потрапляє саме туди. Перший варіант — це поведінка списку, і саме на цьому контрасті будується вся пастка. Щоб отримати справжню копію, треба попросити її явно: тиждень[1:3].copy().
Питання 3 / 8

Масив продажі має форму (4, 7). Яка з операцій впаде з ValueError?

Чому так. mean(axis=1) дає форму (4,). Транслювання порівнює форми з кінця: (4,) доповнюється зліва до (1, 4), і четвірка стикається з сімкою — жодне з чисел не дорівнює одиниці, тож розтягувати нема чого. Полагодити просто: mean(axis=1, keepdims=True) поверне форму (4, 1), і все складеться. Решта три варіанти поєднуються без жодних зусиль.
Питання 4 / 8

У таблиці продажі форми (4, 7) рядки — це магазини, стовпці — дні. Як отримати підсумок за тиждень для кожного магазину, тобто чотири числа?

Чому так. Правило одне: axis=k — це вісь, уздовж якої йде підсумовування, і саме вона зникає з форми. Нам потрібен результат форми (4,), тобто з (4, 7) має зникнути сімка — це вісь 1. Перший варіант спокусливий саме тим, що магазини справді лежать уздовж осі 0, але sum(axis=0) дасть сім чисел — по одному на день, а не на магазин.
Питання 5 / 8

Чому цикл for по масиву NumPy виявляється приблизно вдвічі повільнішим за такий самий цикл по звичайному списку?

Чому так. У списку елемент — це готовий обʼєкт, який давно існує: досить скопіювати адресу. У масиві обʼєктів немає взагалі, тому кожне звертання змушує Python загорнути голі байти у свіжий numpy.float64: виділити памʼять, заповнити заголовок, завести лічильник. Мільйон разів створити й одразу викинути. Саме тому правильна відповідь — не «швидший цикл», а відсутність циклу: векторна операція.
Питання 6 / 8

Що поверне вираз (тиждень > 150).mean(), якщо тиждень = np.array([180, 195, 175, 205, 240, 120, 90])?

Чому так. тиждень > 150 дає масив із dtype(ʼboolʼ), а True в Python дорівнює одиниці. Тому .sum() над маскою рахує скільки (тут 5), а .mean()яка частка (5/7 ≈ 0.714). Щоб отримати 199.0, тобто середнє серед відібраних, треба спершу відібрати: тиждень[тиждень > 150].mean().
Питання 7 / 8

Записали малі = np.array([100, 50, 25], dtype=np.int8), а потім малі * 3. Що станеться?

Чому так. int8 вміщує лише −128…127, і при переповненні NumPy не кидає виняток і не розширює тип — він рахує по колу: 300 перетворюється на 44. Жодного повідомлення ти не побачиш, і саме тому тісний тип звужують лише усвідомлено й із запасом на проміжні обчислення. Обрізання по межі (варіант із 127) — це поведінка np.clip, а не звичайного множення.
Питання 8 / 8

У масиві з_дірками = np.array([120.0, np.nan, 98.0]) треба знайти саму дірку. Який спосіб спрацює?

Чому так. np.nan не дорівнює навіть сам собі — це вимога стандарту чисел з рухомою крапкою, тому порівняння завжди дасть суцільні False. Оператор is питає про тотожність обʼєктів і до вмісту масиву стосунку не має. Єдиний правильний інструмент — np.isnan, який повертає булеву маску; поруч із ним живе родина nansum, nanmean, nanmax, що просто пропускає дірки.