Англійська для розробників NumPy
Словник для розробників, які працюють з NumPy — масиви, трансляція, векторизація і dtypes — для команд, які обговорюють числовий код Python англійською мовою.
Розмови у NumPy сильно залежать від точного словника форм і типів, оскільки більшість помилок у NumPy є невідповідностями форм або немовими примусами типів, а не логічними помилками. Ви можете точно вказати, яку форму або dtype ви очікуєте, замість того, щоб сказати « масив неправильний », це робить ці вади швидко діагностовуваними.
Масиви і форми
** ndarray ** — основний n- вимірний масив NumPy: сітка значень фіксованого розміру, однорідного типу, що робить векторні операції швидкими.
“Це більше не список Python, оскільки це ndarray — саме тому розрізання і математика поводяться так по-різному.”
** Shape ** — кортеж, що описує розміри масиву, наприклад, (3, 224, 224) для 3- канального зображення.
“Друкувати форму перед matmul — я б побився об заклад, що це (3, 224, 224) проти (224, 224, 3) невідповідність порядку каналів.”
** Вісь ** — певний розмір масиву, уздовж якого буде застосовано операцію (наприклад, суму або середнє).
“Вам потрібно axis=1 тут, а не axis=0 — ви сумуєте по стовпчиках, а не по рядках.”
Передача і векторизація
** Broadcasting ** — набір правил NumPy для автоматичного розгортання масивних даних сумісних, але різних форм, щоб операція могла бути застосована до елементів без явних циклів.
“Вам не потрібно розташовувати плитки цього масиву вручну — трансляція автоматично обробляє масив
(3,)проти масиву(100, 3).”
** Векторизація ** — вираз обчислень як операцій на рівні масиву замість циклів на рівні Python, які NumPy виконує у скомпільованому C, а не в інтерпретаторі Python.
“Замінити цей цикл векторизованою операцією — той самий результат, але приблизно в 50 разів швидше на масиві такого розміру.”
** Перегляд проти копії ** — перегляд ділить ту ж саму пам’ ять, що і початковий масив (тобто зміна перегляду змінює оригінал), у той час як копія є повністю незалежною.
- “Ця частина — це перегляд, а не копія — зміна її на місці просто тихо пошкодила початковий масив, який ви передали.” *
Типи і точність
** dtype ** — тип даних кожного елемента масиву (наприклад, float32, int64 ), встановлений для всього масиву, на відміну від списку Python.
“Перевірте dtype перед поділом — ціле поділення на масив int64 обрізається замість того, щоб дати вам дробовий результат, який ви очікували.”
** Type promotion / coercion ** — NumPy безмовно перетворює значення на сумісні dtype під час поєднання масивних даних різних типів, що може приховати втрати точності.
“Змішування float32 і float64 тут тихо підвищує все до float64 — це, ймовірно, чому використання пам’яті подвоїлося після цієї зміни.”
НаN-розповсюдження — спосіб, яким одне значення NaN поширюється через більшість арифметичних операцій, безмовно перетворюючи дійсні результати на NaN вниз по течії.
“Одне відсутнє значення стало NaN, і NaN було розповсюджено через середнє обчислення — саме тому весь рядок повернувся NaN, а не тільки одна комірка.”
Поширені помилки
- Сказати «форми не збігаються» без друку фактичних форм — точність тут знижує декілька раундів вперед-назад.
- Зміна фрагмента і здивування, що початковий масив змінився, не усвідомлюючи, що фрагмент є переглядом, а не копією.
- Припускаючи
NaNна виході означає помилку в поточній лінії, коли вона часто поширюється з відсутніх даних набагато раніше в конвеєрі.
Практичні вправи
- Поясніть у двох реченнях різницю між переглядом NumPy і копією для когось, хто зневаджує неочікувану мутацію.
- Написати короткий коментар щодо перегляду коду, у якому рекомендується векторний замінник циклу Python for- loop над масивом.
- Виконати чернетку повідомлення, що діагностує несподіваний результат
NaN, як поширення відсутніх даних з попереднього джерела.
Зв’язані ресурси
На практиці: Навігація нюансів для не-народжені мовці
Багато з нас, які вивчають професійну англійську як розробники, спочатку зосереджуються на основному словнику - «масив», «функція», «цикл». Але справжня проблема часто полягає в розумінні тонких способів використання цих слів у спільному середовищі кодування. Це не просто про те, щоб знати визначення; це про те, щоб зрозуміти приховану мету, очікування вашої команди, і як сформулювати свої ідеї чітко і впевнено. Розглянемо деякі типові сценарії, де точність має велике значення, особливо для тих, чия перша мова не є англійською.
Особливо складною областю є зворотній зв’язок на перегляд коду. Отримавши коментар на кшталт «Це може бути вигідно для мовлення», можна відчувати себе неопределенным. Розробник може не відразу зрозуміти * чому * трансляція потрібна або як реалізувати її правильно. Часто припускають, що операція не використовувала потужні можливості векторизації NumPy, що призвело до неефективного використання пам’яті і обчислень. Більш корисною відповіддю було б щось на зразок: «Чи не могли б ви розглянути можливість використання трансляції тут? Це може дозволити нам уникнути явного створення нового масиву, що може поліпшити продуктивність. ” Таке оформлення надає контекст — * чому * пропозиція зроблена і як розробник може її розглянути. Аналогічно, при написанні описів PR, ясність є найважливішою. Замість простого повідомлення « Виправлено ваду », слід описати, * як * ваду було виправлено, посилаючись на концепції NumPy, такі як типи даних або операції з масивами, для тих, хто переглядає зміни. « Виправлено проблему, коли неправильне використання dtype призводило до неточності обчислень. Оновлено функцію array_processing, щоб явно перетворити всі вхідні дані на float64, щоб забезпечити послідовні результати»
Інша часто зустрічається область плутанини стосується фразування, пов’язаного з оптимізацією продуктивності. Такі терміни як «векторизація» і «алгоритмічна складність» можуть звучати загрозливо, але вони часто використовуються в повсякденних дискусіях про ефективність коду. Важливо уникати надмірно технічного жаргону при поясненні проблем або пропонування рішень. Замість того, щоб сказати: «Алгоритм має складність O(n^2),» яснішим підходом є: «Ця операція може бути повільною для великих наборів даних, тому що вона обробляє кожен елемент окремо, а не працює на всьому масиви одразу». Сфокусування на впливі - «повільна продуктивність», «великі набори даних» - робить проблему більш релевантною і дієвою.
Нарешті, пам’ятайте, що запитувати прояснюючі питання цілком прийнятно, навіть якщо ви відчуваєте себе трохи сором’язливо. Набагато краще шукати пояснення, ніж робити припущення або ризикувати впровадженням помилок у ваш код. Не вагайтеся сказати щось на зразок: « Чи могли б ви розібратися, що ви маєте на увазі під « оптимізацією операцій з масивом »? » Прояв бажання вчитися і розуміти цінується у будь- якому командному середовищі.
Ось приклад того, як можна реалізувати трансляцію за допомогою NumPy:
import numpy as np
a = np.array([1, 2, 3])
b = 5
c = a + b # Broadcasting automatically expands 'a' to [1, 1, 1, 2, 2, 3]
print(c)