Розкриваємо таємниці броадкастингу в NumPy: Посібник для ентузіастів Python

NumPy є основою наукових обчислень у Python, і одна з його найпотужніших, але інколи недооценених можливостей — це броадкастинг. Броадкастинг дозволяє виконувати операції з масивами різних розмірів без створення зайвих копій даних. Це може значно оптимізувати ваш код, роблячи його швидшим і економнішим у використанні пам'яті.

pic

Візуалізація броадкастингу NumPy — як менші масиви розширюються, щоб відповідати більшим для безперешкодної операції

У цьому блозі ми розберемо, що таке броадкастинг, пояснимо, як він працює, і надамо практичні приклади, щоб ви могли повністю скористатися його потенціалом.

Що таке броадкастинг?

Броадкастинг — це набір правил, які NumPy використовує під час виконання арифметичних операцій над масивами різних розмірів. Коли два масиви мають різні форми, NumPy намагається автоматично розширити менший масив, щоб він відповідав формі більшого. Це дозволяє уникнути необхідності створювати великі проміжні масиви, економлячи час і пам'ять.

Простіше кажучи, броадкастинг дозволяє NumPy векторизувати операції, уникаючи явних циклів у вашому коді.

Броадкастинг у дії

Давайте подивимося на базовий приклад:

import numpy as np  

A = np.array([[1, 2, 3], [4, 5, 6]]) # Shape (2, 3)  
B = np.array([1, 2, 3]) # Shape (3,)  
result = A + B  
print(result)

Вивід:

[[2 4 6]  
 [5 7 9]]

Тут B — це одномірний масив з формою (3,), але A — це двовимірний масив з формою (2, 3). NumPy розширює B, щоб він відповідав формі A, ефективно обробляючи його так:

[[1 2 3]  
 [1 2 3]]

Це дозволяє уникнути необхідності вручну повторювати B вздовж першої осі.

Правила броадкастингу

Щоб броадкастинг працював, повинні бути виконані такі умови:

  1. Розміри повинні збігатися з правої сторони — NumPy порівнює форми масивів за останніми розмірами.
  2. Розміри повинні співпадати або бути рівними 1 — Якщо розміри не співпадають, один з них має бути рівним 1. Тоді NumPy розтягує цей розмір, щоб відповідати більшому.

Наприклад:

X = np.array([[1], [2], [3]]) # Shape (3, 1)  
Y = np.array([4, 5, 6]) # Shape (3,)  

result = X * Y

Тут Y буде розширено до форми (3, 3):

[[4 5 6]  
 [4 5 6]  
 [4 5 6]]

Результат:

[[4 5 6]  
 [8 10 12]  
 [12 15 18]]

Практичні випадки використання

1. Масштабування рядків або стовпців

matrix = np.array([[1, 2, 3], [4, 5, 6]]) # Shape (2, 3)  
scaling_factor = np.array([[2], [3]]) # Shape (2, 1)  

scaled = matrix * scaling_factor  
print(scaled)

Вивід:

[[2 4 6]  
 [12 15 18]]

2. Нормалізація даних

data = np.array([[1, 2], [3, 4], [5, 6]])  
mean = data.mean(axis=0)  
normalized = data - mean

Це нормалізує кожен стовпець без необхідності циклічно обходити рядки.

Коли броадкастинг не працює

Якщо правила броадкастингу не виконуються, NumPy викидає ValueError:

A = np.array([[1, 2], [3, 4]]) # Shape (2, 2)  
B = np.array([1, 2, 3]) # Shape (3,)  

A + B # Помилка: форми (2,2) і (3,) не узгоджуються

Щоб виправити це, змініть форму B або коригуйте розміри масивів.

Ключові моменти

  • Броадкастинг дозволяє уникнути явних циклів.
  • Це дозволяє писати лаконічний, зрозумілий і оптимізований код.
  • Розуміння броадкастингу допомагає розкрити весь потенціал NumPy для числових обчислень.

Наступного разу, коли ви напишете цикл для виконання операцій поелементно, подумайте про броадкастинг! Опанувавши цю концепцію, ви зможете підвищити свої навички маніпулювання даними та писати код, який буде не тільки елегантним, але й ефективним.

Перекладено з: Demystifying Broadcasting in NumPy: A Guide for Python Enthusiasts

Leave a Reply

Your email address will not be published. Required fields are marked *