Python
Tema 3 · NumPy
Introducció
NumPy (Numerical Python) és la biblioteca fonamental per al càlcul científic en Python. Proporciona arrays multidimensionals i eines per operar-hi de manera eficient (operacions vectorials). En lloc de fer bucles element a element, NumPy aplica operacions sobre arrays sencers, cosa que accelera enormement els càlculs numèrics.
Objectius
- Crear arrays NumPy a partir de llistes o amb funcions (
np.array,np.zeros,np.linspace) - Fer operacions vectorials (suma, multiplicació, funcions matemàtiques) sense bucles
- Indexar i fer slicing d'arrays
- Calcular estadístiques bàsiques amb NumPy (
mean,std,min,max)
Creació d'arrays i operacions vectorials
Exemple bàsic: glucosa de 5 pacients en dejú i postprandial.
import numpy as np
# Arrays de glucosa (mg/dL)
deju = np.array([92, 88, 105, 78, 95])
postprandial = np.array([140, 135, 162, 128, 148])
# Operació vectorial: diferència postprandial - dejú
increment = postprandial - deju
print("Increments:", increment)
# Mitjana i desviació estàndard
print(f"Mitjana dejú: {np.mean(deju):.1f} mg/dL")
print(f"Desviació dejú: {np.std(deju):.1f} mg/dL")
# Quins pacients superen el llindar de 100 mg/dL en dejú?
mascara = deju > 100
print("Pacients amb glucosa > 100:", deju[mascara])
Funcions per generar arrays: zeros, ones, linspace.
# Concentracions teòriques d'un fàrmac cada 2 hores (0 a 24 h)
temps = np.linspace(0, 24, 13) # 13 punts equiespaiats
print("Temps (h):", temps)
# Simulació d'una cinètica de primer ordre
dosi_inicial = 100 # mg
k_elim = 0.15 # h⁻¹
concentracio = dosi_inicial * np.exp(-k_elim * temps)
print("Concentració (mg):", np.round(concentracio, 2))
Arrays 2D i slicing
Matriu de dades de pressió arterial (3 pacients, 4 mesures):
# Files: pacients, Columnes: mesures (matí, migdia, tarda, nit)
PA = np.array([
[120, 125, 118, 122],
[135, 140, 132, 138],
[110, 112, 108, 115]
])
print("Forma de l'array:", PA.shape) # (3, 4)
print("Primer pacient:", PA[0, :]) # fila 0, totes les columnes
print("Mesures del matí:", PA[:, 0]) # totes les files, columna 0
# Mitjana de cada pacient (per files, axis=1)
print("Mitjana per pacient:", np.mean(PA, axis=1))
# Pacients amb mitjana > 130 (hipertensió)
mitjanes = np.mean(PA, axis=1)
print("Pacients hipertensos:", np.where(mitjanes > 130)[0])
Exercicis
- Crea un array amb 50 valors aleatoris de glucosa (entre 70 i 150 mg/dL) i calcula quants estan per sobre de 110.
- Donada una matriu de temperatures de 7 pacients durant 5 dies, calcula la temperatura mitjana de cada dia i del total.
- Simula la cinètica d'un fàrmac (C = C₀·e^(-kt)) per a 3 valors de k_elim diferents i mostra les corbes de concentració en un array 2D.
Mini Projecte – Anàlisi de dades de laboratori amb NumPy
Crea un programa que processi les dades d'un estudi clínic:
- Genera o carrega un array de 100 pacients amb 3 columnes: glucosa (mg/dL), colesterol total (mg/dL) i pressió sistòlica (mmHg).
- Utilitza NumPy per calcular la mitjana, desviació estàndard, mínim i màxim de cada paràmetre.
- Identifica els pacients amb glucosa > 125 mg/dL (possible diabetis).
- Calcula la correlació entre glucosa i colesterol (usa
np.corrcoef). - Guarda els resultats en un fitxer CSV i mostra un resum per pantalla amb les estadístiques principals.
Pista: utilitza np.random.normal per generar les dades amb mitjanes i desviacions realistes.