Arrays en Python
Aprende a crear y usar arrays en Python con el módulo array: typecodes, indexación, slicing, mutación de elementos y cuándo preferir arrays sobre listas.
Este capítulo cubre el módulo array integrado de Python, que proporciona una secuencia compacta y con tipo restringido para almacenar datos numéricos homogéneos. Aprenderás qué son los type codes, cómo crear e indexar arrays, cómo mutarlos con el conjunto completo de métodos disponibles y — de manera fundamental — cuándo un array es la elección correcta frente a una lista de Python común.
¿Qué es el módulo array?
El módulo array de Python proporciona un tipo de secuencia que almacena elementos de un único tipo numérico compatible con C. A diferencia de una lista, que puede contener cualquier mezcla de objetos, cada posición en un array contiene exactamente el mismo tipo de valor primitivo (un entero, un float, etc.). Esta restricción hace que los arrays sean más eficientes en memoria que las listas para grandes colecciones de números.
Puntos clave:
- Definido en la biblioteca estándar — no requiere instalación.
- Todos los elementos deben compartir el mismo typecode (un carácter único que identifica el tipo C).
- Admite operaciones de secuencia estándar: indexación, slicing, iteración,
len()y comprobación de pertenencia conin. - Útil cuando necesitas almacenamiento compacto sin recurrir a una biblioteca de terceros como NumPy.
Si ya estás familiarizado con las listas de Python, piensa en un array como una lista que sacrifica flexibilidad por eficiencia de memoria.
Typecodes
Cada array se crea con un typecode — una cadena de un carácter que le indica a Python qué tipo C usar para cada elemento y, por tanto, cuántos bytes ocupa cada posición.
| Typecode | Tipo C | Bytes mínimos | Uso típico |
|---|---|---|---|
'b' | signed char | 1 | Enteros pequeños de −128 a 127 |
'B' | unsigned char | 1 | Enteros pequeños no negativos de 0 a 255 |
'h' | signed short | 2 | Enteros medianos |
'H' | unsigned short | 2 | Enteros medianos no negativos |
'i' | signed int | 2 | Enteros de propósito general (generalmente 4 bytes) |
'I' | unsigned int | 2 | Enteros no negativos |
'l' | signed long | 4 | Enteros más grandes |
'L' | unsigned long | 4 | Enteros más grandes no negativos |
'q' | signed long long | 8 | Enteros muy grandes |
'Q' | unsigned long long | 8 | Enteros muy grandes no negativos |
'f' | float | 4 | Punto flotante de precisión simple |
'd' | double | 8 | Punto flotante de doble precisión |
El tamaño real en bytes puede variar según la plataforma. Usa array.itemsize para inspeccionarlo en tiempo de ejecución.
Nota sobre
'u'(carácter Unicode): Este typecode fue marcado como obsoleto en Python 3.3 y eliminado en Python 3.13. No lo uses en código nuevo — usastrobytesen su lugar.
Crear arrays
Importa el módulo y llama a array.array(typecode, initializer), donde initializer es cualquier iterable de valores compatibles con el typecode elegido.
import array as arr
# Array of signed integers
int_array = arr.array('i', [1, 2, 3, 4, 5])
print(int_array) # array('i', [1, 2, 3, 4, 5])
# Array of double-precision floats
float_array = arr.array('d', [1.1, 2.2, 3.3])
print(float_array) # array('d', [1.1, 2.2, 3.3])
# Inspect the typecode and bytes-per-element
print(int_array.typecode) # i
print(int_array.itemsize) # 4 (platform-dependent)También puedes crear un array vacío y llenarlo más tarde:
import array as arr
empty = arr.array('i') # empty integer array
empty.append(10)
empty.append(20)
print(empty) # array('i', [10, 20])Acceder a elementos del array
La indexación de arrays funciona exactamente igual que la indexación de listas: basada en cero desde la izquierda, y los índices negativos cuentan desde la derecha.
Acceder a un índice fuera del rango válido lanza un IndexError, exactamente igual que con las listas.
Slicing de arrays
El slicing devuelve un nuevo array del mismo typecode que contiene los elementos seleccionados. La sintaxis es a[start:stop:step] — la misma que para listas y strings.
Iterar sobre un array
Puedes iterar sobre un array con un bucle for, o comprobar la pertenencia con in:
import array as arr
a = arr.array('i', [10, 20, 30, 40, 50])
for item in a:
print(item, end=' ')
# Output: 10 20 30 40 50
print()
print(30 in a) # True
print(99 in a) # False
print(len(a)) # 5Modificar arrays
Los arrays son mutables — puedes cambiar, añadir y eliminar elementos después de crearlos.
Cambiar un elemento
Asigna un nuevo valor directamente a un índice:
Añadir elementos
Usa append() para añadir un único elemento al final, o extend() para añadir múltiples elementos desde cualquier iterable:
Usa insert(index, value) para colocar un elemento en una posición específica:
import array as arr
a = arr.array('i', [1, 2, 3, 4, 5])
a.insert(2, 10) # insert 10 before index 2
print(a) # array('i', [1, 2, 10, 3, 4, 5])Eliminar elementos
remove(value) elimina la primera aparición del valor dado y lanza ValueError si no se encuentra:
pop(index) elimina y devuelve el elemento en index (por defecto, el último elemento):
import array as arr
a = arr.array('i', [1, 2, 3, 4, 5])
last = a.pop() # removes and returns 5
print(last) # 5
print(a) # array('i', [1, 2, 3, 4])
second = a.pop(1) # removes and returns element at index 1
print(second) # 2
print(a) # array('i', [1, 3, 4])Buscar y contar
index(value) devuelve el índice de la primera aparición de value (lanza ValueError si no está presente):
import array as arr
a = arr.array('i', [10, 20, 30, 20, 40])
print(a.index(20)) # 1 — first occurrence
print(a.index(30)) # 2count(value) devuelve cuántas veces aparece value:
import array as arr
a = arr.array('i', [1, 2, 2, 3, 2, 4])
print(a.count(2)) # 3
print(a.count(9)) # 0Invertir un array
reverse() invierte el array en su lugar:
import array as arr
a = arr.array('i', [1, 2, 3, 4, 5])
a.reverse()
print(a) # array('i', [5, 4, 3, 2, 1])Convertir entre arrays y listas
tolist() convierte un array en una lista de Python estándar. Para hacer lo contrario, pasa una lista a array.array():
import array as arr
a = arr.array('i', [1, 2, 3, 4, 5])
# array → list
my_list = a.tolist()
print(my_list) # [1, 2, 3, 4, 5]
print(type(my_list)) # <class 'list'>
# list → array
back = arr.array('i', my_list)
print(back) # array('i', [1, 2, 3, 4, 5])Cambiar el tipo de elemento
El atributo typecode es de solo lectura. Para almacenar los mismos valores con un tipo diferente, crea un nuevo array usando el original como inicializador:
Eficiencia de memoria: arrays vs. listas
La principal razón práctica para usar el módulo array en lugar de una lista es la memoria. Una lista almacena referencias a objetos Python; un array almacena los valores C sin procesar directamente.
import array as arr
import sys
n = 1000
my_list = list(range(n))
my_array = arr.array('i', range(n))
print('List size:', sys.getsizeof(my_list), 'bytes')
print('Array size:', sys.getsizeof(my_array), 'bytes')
# Example output (64-bit platform):
# List size: 8056 bytes
# Array size: 4096 bytesPara conjuntos de datos grandes (cientos de miles de enteros), el ahorro se acumula de manera significativa. Si necesitas aún más capacidad — matemáticas vectorizadas, arrays multidimensionales — considera NumPy.
Cuándo usar arrays vs. listas
Usa el módulo array cuando:
- Estás almacenando una gran cantidad de valores numéricos homogéneos (lecturas de sensores, datos de píxeles, búferes de red, etc.).
- El uso de memoria es una preocupación y no puedes usar una biblioteca de terceros.
- Estás leyendo o escribiendo en archivos binarios o sockets de red (los métodos
tofile()/fromfile()hacen esto sencillo).
Usa las listas de Python cuando:
- Necesitas almacenar tipos mixtos u objetos arbitrarios.
- La colección es pequeña y la memoria no es una preocupación.
- Necesitas métodos de lista avanzados como
sort()con una función clave.
Usa NumPy cuando:
- Necesitas operaciones matemáticas sobre arrays completos (aritmética vectorizada, álgebra matricial, estadística).
- Estás trabajando con datos multidimensionales.
Referencia de métodos
| Método | Descripción |
|---|---|
append(x) | Añade x al final del array |
extend(iterable) | Añade todos los elementos del iterable al final |
insert(i, x) | Inserta x antes del índice i |
remove(x) | Elimina la primera aparición de x |
pop([i]) | Elimina y devuelve el elemento en el índice i (por defecto: el último) |
index(x) | Devuelve el índice de la primera aparición de x |
count(x) | Devuelve el número de apariciones de x |
reverse() | Invierte el array en su lugar |
tolist() | Convierte el array en una lista de Python |
tofile(f) | Escribe todos los elementos en el objeto de archivo abierto f como valores de máquina |
fromfile(f, n) | Lee n elementos del objeto de archivo f y los añade al array |