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

  1. Crea un array amb 50 valors aleatoris de glucosa (entre 70 i 150 mg/dL) i calcula quants estan per sobre de 110.
  2. Donada una matriu de temperatures de 7 pacients durant 5 dies, calcula la temperatura mitjana de cada dia i del total.
  3. 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.