Broadcasting în NumPy

Regulile prin care NumPy face operații între tablouri de forme diferite, de exemplu o matrice și un rând sau un scalar.

Sintaxă
a + scalar
matrice + rand          # forme (m, n) și (n,)
matrice + coloana[:, np.newaxis]   # forme (m, n) și (m, 1)

Ce face Broadcasting

Broadcasting înseamnă că NumPy „întinde” tabloul mai mic peste cel mare, fără să copieze datele. Cel mai simplu caz: a + 10 adaugă 10 la fiecare element.

Regula: formele se compară de la dreapta la stânga, dimensiune cu dimensiune. Două dimensiuni sunt compatibile dacă sunt egale sau dacă una dintre ele este 1. Dimensiunile lipsă din stânga se consideră 1. De exemplu (2, 3) și (3,) sunt compatibile (rândul se aplică fiecărui rând), iar (2, 3) și (2,) nu.

Ca să aplici o valoare pe fiecare rând (o coloană), transformă tabloul 1D într-o coloană cu np.newaxis: b[:, np.newaxis] are forma (2, 1). Formele incompatibile dau ValueError.

Parametri

Parametru Descriere
np.newaxis Folosit la indexare, adaugă o dimensiune de lungime 1 (este None).

Ce returnează

Un tablou cu forma „cea mai mare” pe fiecare dimensiune.

Exemple

Exemplul 1: Scalar și rând

Prețurile pe 2 magazine și 3 produse: un adaos fix de 2 lei și apoi un discount diferit pe fiecare produs (rând de formă (3,)).

import numpy as np

preturi = np.array([[10.0, 20.0, 30.0],
                    [12.0, 18.0, 33.0]])
print(preturi + 2)

discount = np.array([0.9, 0.8, 1.0])
print(preturi * discount)

Rezultat

[[12. 22. 32.]
 [14. 20. 35.]]
[[ 9.  16.  30. ]
 [10.8 14.4 33. ]]

Exemplul 2: Coloană cu np.newaxis

Fiecare magazin are alt cost de transport. Forma (2,) devine (2, 1) și se adaugă pe rânduri.

import numpy as np

preturi = np.array([[10, 20, 30],
                    [12, 18, 33]])
transport = np.array([5, 1])

coloana = transport[:, np.newaxis]
print(coloana.shape)
print(preturi + coloana)

Rezultat

(2, 1)
[[15 25 35]
 [13 19 34]]

Exemplul 3: Forme incompatibile

Ultimele dimensiuni sunt 3 și 2: nu sunt egale și niciuna nu este 1.

import numpy as np

preturi = np.array([[10, 20, 30],
                    [12, 18, 33]])
transport = np.array([5, 1])

try:
    print(preturi + transport)
except ValueError as e:
    print("Eroare:", e)

Rezultat

Eroare: operands could not be broadcast together with shapes (2,3) (2,)

Greșeli frecvente

  • Adaugi un tablou 1D cu lungimea egală cu numărul de rânduri și aștepți să se aplice pe rânduri. Broadcasting-ul aliniază la dreapta (pe coloane); folosește b[:, np.newaxis].
  • Combini fără să vrei o coloană (3, 1) cu un rând (3,): nu primești eroare, ci un tablou (3, 3). Verifică shape înainte.
  • Crezi că broadcasting-ul copiază tabloul mic de mai multe ori în memorie. Nu copiază: calculul se face direct pe datele existente.

Comenzi înrudite