Operacions amb arrays
En aquesta llicó, explorarem com realitzar operacions aritmètiques i matemàtiques amb arrays de NumPy. Veurem com utilitzar operadors bàsics, funcions universals i el concepte de broadcasting per treballar eficientment amb dades numèriques.
Operacions aritmètiques element a element
NumPy permet realitzar operacions aritmètiques directament sobre arrays. Aquestes operacions s'apliquen element a element (component a component).
Els operadors aritmètics habituals funcionen amb arrays:
import numpy as np
a = np.array([1, 2, 3, 4])
b = np.array([10, 20, 30, 40])
print(a + b) # [11 22 33 44]
print(a - b) # [-9 -18 -27 -36]
print(a * b) # [10 40 90 160]
print(a / b) # [0.1 0.1 0.1 0.1]
print(a ** 2) # [1 4 9 16]
print(a % 3) # [1 2 0 1]Quan operem un array amb un escalar, l'operació s'aplica a tots els elements:
a = np.array([1, 2, 3, 4])
print(a + 10) # [11 12 13 14]
print(a * 2) # [2 4 6 8]
print(a / 2) # [0.5 1. 1.5 2. ]
print(a ** 2) # [1 4 9 16]Broadcasting
El broadcasting és un mecanisme que permet a NumPy operar amb arrays de formes diferents. Automàticament "expandeix" els arrays més petits perquè tinguin formes compatibles amb els més grans, sense necessitat de copiar dades. Aquestes són les regles del broadcasting:
NumPy compara les dimensions dels arrays d'esquerra a dreta:
- Si els arrays no tenen el mateix nombre de dimensions, s'afegeixen dimensions de mida 1 a l'esquerra de l'array més petit.
- Les dimensions són compatibles si són iguals o si una d'elles és 1.
- Si alguna dimensió és incompatible, es produeix un error.
Aquests són alguns exemples pràctics:
Broadcasting amb un escalar:
pythona = np.array([[1, 2, 3], [4, 5, 6]]) print(a + 10) # [[11 12 13] # [14 15 16]]Broadcasting amb un vector:
pythona = np.array([[1, 2, 3], [4, 5, 6]]) b = np.array([10, 20, 30]) print(a + b) # [[11 22 33] # [14 25 36]]Broadcasting amb arrays de dimensions diferents:
pythona = np.array([[1], [2], [3]]) # forma (3, 1) b = np.array([10, 20, 30]) # forma (3,) print(a + b) # [[11 21 31] # [12 22 32] # [13 23 33]]
Funcions matemàtiques universals
Les funcions universals són funcions que operen element a element sobre arrays, de manera vectoritzada i eficient.
Aquest és un exemple de funcions universals trigonomètriques:
angles = np.array([0, np.pi/6, np.pi/4, np.pi/3, np.pi/2])
print(np.sin(angles)) # [0. 0.5 0.707... 0.866... 1.]
print(np.cos(angles)) # [1. 0.866... 0.707... 0.5 0.]
print(np.tan(angles)) # [0. 0.577... 1. 1.732... 1.633e+16]Altres funcions matemàtiques comunes inclouen:
Funcions trigonomètriques inverses:
np.arcsin(),np.arccos(),np.arctan().Exponencials i logaritmes:
np.exp(),np.log(),np.log10(),np.log2().Arrodoniments i valor absolut:
np.abs(),np.floor(),np.ceil(),np.round().Altres funcions útils:
np.sqrt(),np.square(),np.power(),np.sign().
Operacions de comparació
Els operadors de comparació retornen arrays de booleans i funcionen element a element:
a = np.array([1, 2, 3, 4, 5])
b = np.array([5, 4, 3, 2, 1])
print(a == b) # [False False True False False]
print(a < b) # [ True True False False False]
print(a >= 3) # [False False True True True]Aquests arrays de booleans es poden utilitzar per indexar:
a = np.array([1, 2, 3, 4, 5])
print(a[a > 3]) # [4 5]Fes funcions all() i any() permeten comprovar si tots o algun dels elements compleixen una condició:
a = np.array([1, 2, 3, 4, 5])
print(np.all(a > 0)) # True (tots són positius)
print(np.all(a > 3)) # False (no tots són > 3)
print(np.any(a > 3)) # True (algun és > 3)
print(np.any(a > 10)) # False (cap és > 10)Aquestes funcions també es poden aplicar per eixos:
a = np.array([[1, 2, 3],
[0, 5, 6]])
print(np.all(a > 0, axis=0)) # [False True True]
print(np.any(a > 5, axis=1)) # [False True]
Jordi Petit
Lliçons.jutge.org
© Universitat Politècnica de Catalunya, 2025
