Qué es un array en programación: arreglos, vectores, índices y matrices

Un array —en español, arreglo o vector— es una estructura de datos que guarda varios valores bajo un mismo nombre, colocados uno detrás de otro, y permite llegar a cualquiera de ellos por su posición, que se llama índice. Si una variable es una caja con una etiqueta, un array es una fila de cajas numeradas: notas[0], notas[1], notas[2]… Es la forma más sencilla de que un programa recuerde muchos datos sin tener que inventar un nombre para cada uno.

Es la octava pieza de una serie. El algoritmo es la secuencia de pasos; el diagrama de flujo es cómo se dibuja; el pseudocódigo es cómo se escribe; la variable guarda un dato; el bucle repite; la estructura condicional decide, y la función empaqueta. El array es la primera estructura de datos: la pieza que permite que todo lo anterior trabaje con muchos valores a la vez. Y vuelve a lo de siempre, el input y el output: lo que entra en un programa casi nunca es un dato, sino una lista de datos.

Definición

Array (también arreglo, vector, matriz o, en manuales antiguos, tabla; en inglés, array): estructura de datos que almacena una colección de elementos, normalmente del mismo tipo, en posiciones consecutivas, cada una identificada por un número entero llamado índice. Se accede a cualquier elemento directamente, indicando el nombre del array y su índice.

Tres palabras de la definición hacen todo el trabajo:

  • Un solo nombre. Todo el conjunto se llama notas, no nota1, nota2, nota3.
  • Consecutivas. Los elementos van seguidos, en orden. El primero, el segundo, el tercero.
  • Índice. Cada posición tiene un número, y con ese número se llega a ella sin recorrer las anteriores.

Sobre los nombres: array es el término inglés y el que se usa en casi todos los lenguajes; arreglo es la traducción más extendida en América Latina; en España se dice mucho vector para el de una dimensión y matriz para el de dos, que es como se llaman en matemáticas. Son la misma idea.

Por qué hace falta un array

Una variable guarda un valor. Con eso se puede calcular la media de unas notas sin array: se lee cada nota, se suma a un acumulador y se olvida. Pero hay preguntas que no se pueden responder así. Por ejemplo: ¿cuántos días de la semana hizo más calor que la media?

Para saberlo hay que conocer la media, y la media solo se sabe cuando se han leído todos los días. Para entonces, si no se han guardado, los días ya se han perdido. Hace falta recordarlos todos. Con siete variables —t1, t2… t7— es posible pero torpe; con 365 es inviable, y con un número que no se conoce de antemano, imposible. El array resuelve las tres cosas: un nombre, tantas posiciones como datos, y un índice que un bucle puede ir moviendo.

Las partes de un array

temperaturas ← [18, 21, 24, 19, 26, 27, 22]

temperaturas[0]   →  18     (el primer elemento)
temperaturas[4]   →  26     (el quinto)
longitud(temperaturas) → 7
  • El nombre: temperaturas. Se refiere al conjunto entero.
  • Los elementos: cada uno de los valores guardados.
  • El índice: el número de posición, entre corchetes. En la mayoría de los lenguajes, el primero es el 0.
  • La longitud (o tamaño): cuántos elementos tiene. Con 7 elementos y empezando en 0, el último índice es 6, no 7. Esa diferencia de uno es la fuente del error más repetido de la programación.

Para cambiar un valor se asigna a una posición, igual que a una variable: temperaturas[2] ← 25 sustituye el 24 por el 25 y deja el resto como estaba.

Por qué los índices empiezan en 0

Es lo primero que extraña a quien empieza, y tiene una explicación física. Un array ocupa un bloque de memoria seguido, y el ordenador sabe dónde empieza. Para encontrar un elemento calcula:

dirección del elemento i = dirección de inicio + i × tamaño de cada elemento

Si cada número entero ocupa 4 bytes —lo habitual en los sistemas actuales— y el array empieza en la dirección 1000, el elemento 0 está en 1000, el 1 en 1004 y el 2 en 1008. El índice no es «el número de orden» sino cuántos elementos hay que saltar desde el principio. El primero está a cero saltos.

Esa cuenta explica también la gran ventaja del array: llegar al elemento 5 o al 5.000 cuesta lo mismo, una multiplicación y una suma. No hay que pasar por los anteriores.

No todos los lenguajes empiezan en 0. FORTRAN, el primer lenguaje de alto nivel de uso extendido (1957), numeraba desde 1, y siguen haciéndolo Lua, MATLAB, R o la mayoría de libros de pseudocódigo para principiantes. C eligió el 0 porque en C a[i] es literalmente «la posición de a más i», y los lenguajes que heredaron su sintaxis —C++, Java, JavaScript, C#— y también Python se quedaron con él. Edsger Dijkstra defendió la elección en una nota de 1982, Why numbering should start at zero (EWD831): contar desde 0 hace que un rango de n elementos sea 0 ≤ i < n, y su longitud, exactamente n.

Recorrer un array

Casi todo lo que se hace con un array consiste en recorrerlo: visitar cada elemento con un bucle PARA cuyo contador hace de índice.

PARA i ← 0 HASTA longitud(temperaturas) - 1 HACER
    ESCRIBIR temperaturas[i]
FIN PARA

Ese - 1 del final no es un detalle: si se omite, la última vuelta pide temperaturas[7], una posición que no existe. Por eso los lenguajes modernos ofrecen una forma de recorrer sin tocar el índice —«para cada elemento de la lista»—, que elimina el error de raíz:

PARA CADA t EN temperaturas HACER
    ESCRIBIR t
FIN PARA

Ejemplo resuelto: cuántos días superan la media

Es el problema que no se podía resolver sin array. En pseudocódigo:

ALGORITMO DiasCalurosos
    temperaturas ← [18, 21, 24, 19, 26, 27, 22]
    n ← longitud(temperaturas)

    // Primera pasada: la media
    suma ← 0
    PARA i ← 0 HASTA n - 1 HACER
        suma ← suma + temperaturas[i]
    FIN PARA
    media ← suma / n

    // Segunda pasada: comparar cada día con la media
    contador ← 0
    PARA i ← 0 HASTA n - 1 HACER
        SI temperaturas[i] > media ENTONCES
            contador ← contador + 1
        FIN SI
    FIN PARA

    ESCRIBIR "Media:", media
    ESCRIBIR "Días por encima:", contador
FIN ALGORITMO

La traza: la suma es 18 + 21 + 24 + 19 + 26 + 27 + 22 = 157, y la media, 157 / 7 ≈ 22,43. Superan esa media el 24, el 26 y el 27: tres días. El 22 se queda justo por debajo.

Lo importante es la segunda pasada: vuelve sobre unos datos que ya se habían leído. Sin el array no habría nada sobre lo que volver. Aparecen además todas las piezas anteriores de la serie: dos variables con nombre propio —el acumulador suma y el contador—, dos bucles y una condición.

El mismo ejemplo en tres lenguajes

Pseudocódigo Python JavaScript
Crear t ← [18, 21, 24] t = [18, 21, 24] const t = [18, 21, 24];
Leer el primero t[0] t[0] t[0]
Leer el último t[longitud(t) - 1] t[-1] t[t.length - 1] o t.at(-1)
Longitud longitud(t) len(t) t.length
Añadir al final — t.append(30) t.push(30)
Recorrer PARA CADA x EN t for x in t: for (const x of t)
Índice fuera de rango — error IndexError devuelve undefined

La última fila importa más de lo que parece. Python se detiene con un error en cuanto se pide una posición que no existe: molesto, pero avisa. JavaScript devuelve undefined y sigue, de modo que el fallo aparece más adelante y lejos de su causa. Y en C, leer fuera del array ni siquiera está definido: el programa lee lo que haya en esa memoria, que es el origen de una familia entera de fallos de seguridad, los desbordamientos de búfer.

La solución completa en Python cabe en cuatro líneas:

temperaturas = [18, 21, 24, 19, 26, 27, 22]
media = sum(temperaturas) / len(temperaturas)
dias = sum(1 for t in temperaturas if t > media)
print(f"Media: {media:.2f} · Días por encima: {dias}")

Arrays de dos dimensiones: las matrices

Un array puede contener otros arrays. Si cada elemento es a su vez una fila, se obtiene una tabla, que se recorre con dos índices: fila y columna.

notas ← [ [7, 5, 9],      // alumno 0: tres exámenes
          [6, 8, 4],      // alumno 1
          [9, 9, 10] ]    // alumno 2

notas[1][2]  →  4    (alumno 1, examen 2)

Se recorre con un bucle anidado: uno para las filas y, dentro, otro para las columnas. Una hoja de cálculo, un tablero de ajedrez o una imagen —que es una cuadrícula de píxeles— son arrays de dos dimensiones. En memoria, sin embargo, todo sigue siendo una fila: C y la mayoría de los lenguajes guardan la tabla fila tras fila, mientras FORTRAN la guarda columna tras columna. Recorrerla en el mismo orden en que está guardada es notablemente más rápido, y es una de las primeras optimizaciones que se aprenden en cálculo numérico.

Array frente a lista

En la teoría clásica, un array tiene un tamaño fijo que se decide al crearlo, y una lista puede crecer y encoger. En la práctica, la frontera se ha difuminado:

  • En C o en los arrays básicos de Java, el tamaño es fijo. Si se necesita uno más grande, hay que crear otro y copiar.
  • En Python no hay arrays en el lenguaje básico: lo que se usa es la lista (list), que por dentro es un array que se amplía solo cuando se llena. Para cálculo numérico se usan los arrays de NumPy, de tamaño fijo y un solo tipo, mucho más rápidos.
  • En JavaScript, Array crece y encoge sin límite y puede mezclar tipos.

Lo que no cambia es el coste de cada operación. Leer o cambiar la posición i es inmediato. Insertar o borrar al principio o en medio es caro, porque hay que desplazar todos los elementos que vienen detrás. Añadir al final suele ser barato.

Buscar en un array

Para saber si un valor está en un array desordenado no hay más remedio que mirarlos uno a uno: es la búsqueda lineal, y en el peor caso revisa todos los elementos. Si el array está ordenado, se puede hacer algo mucho mejor: mirar el elemento del centro, descartar la mitad donde no puede estar y repetir. Es la búsqueda binaria, y la diferencia es enorme: en un array ordenado de un millón de elementos encuentra cualquier valor con 20 comparaciones como máximo, porque 2²⁰ = 1.048.576. La búsqueda lineal podría necesitar el millón. Es el ejemplo clásico de que un buen algoritmo importa más que un ordenador rápido.

Los errores más frecuentes

  1. Salirse por uno (off-by-one). Recorrer hasta longitud en lugar de longitud - 1, o empezar en 1 en un lenguaje que empieza en 0. Es tan común que tiene nombre propio.
  2. Confundir la longitud con el último índice. Un array de 10 elementos no tiene posición 10.
  3. Pedir una posición de un array vacío. t[0] en un array sin elementos falla. Antes de leer, se comprueba la longitud.
  4. Modificar el array mientras se recorre. Borrar elementos dentro del bucle que los visita hace que se salten algunos. Se recorre una copia o se construye un array nuevo con lo que se quiere conservar.
  5. Creer que asignar copia. En Python y JavaScript, b = a no crea otro array: b y a son dos nombres para el mismo. Cambiar b[0] cambia a[0]. Es lo mismo que ocurre al pasar un array a una función. Para copiar: b = a.copy() en Python, const b = [...a] en JavaScript.
  6. Usar arrays paralelos. Un array con nombres y otro con edades, emparejados por posición, se desincronizan en cuanto se ordena o se borra uno sin el otro. Mejor un solo array de registros, cada uno con su nombre y su edad.

Arrays e inteligencia artificial

El array es también la materia prima de la inteligencia artificial actual. Cuando se dice que un modelo convierte un texto en un vector o embedding, se quiere decir exactamente eso: un array de números, normalmente cientos o miles, en el que textos parecidos dan arrays parecidos. Una imagen es un array de dos dimensiones de píxeles —tres, si se cuentan los canales de color—, y las redes neuronales trabajan con tensores, que es el nombre que se da en ese campo a los arrays de cualquier número de dimensiones. Bibliotecas como NumPy o PyTorch existen, ante todo, para operar con arrays enormes muy deprisa. La fila de cajas numeradas del principio es, a gran escala, lo que mueve un modelo de lenguaje.

Preguntas frecuentes

¿Qué es un array en programación?

Es una estructura de datos que guarda varios valores bajo un mismo nombre, en posiciones consecutivas numeradas. A cada valor se llega por su posición, llamada índice: notas[0] es el primero, notas[1] el segundo. Permite trabajar con muchos datos sin crear una variable para cada uno.

¿Qué diferencia hay entre array, arreglo y vector?

Ninguna de fondo: son nombres del mismo concepto. Array es el término inglés y el de los lenguajes de programación; arreglo es la traducción más usada en América Latina; vector se emplea mucho en España, sobre todo para los arrays de una dimensión. A los de dos dimensiones se les llama matrices.

¿Por qué los arrays empiezan en 0?

Porque el índice indica cuántos elementos hay que saltar desde el principio del array para llegar al que se busca, y el primero está a cero saltos. El ordenador calcula la posición de cada elemento como la dirección de inicio más el índice por el tamaño del elemento. No todos los lenguajes lo siguen: FORTRAN, Lua, MATLAB y R empiezan en 1.

¿Qué es un array bidimensional?

Es un array cuyos elementos son a su vez arrays, lo que forma una tabla de filas y columnas. Se accede a cada valor con dos índices, tabla[fila][columna], y se recorre con dos bucles anidados. También se llama matriz.

¿Qué diferencia hay entre un array y una lista?

En teoría, el array tiene un tamaño fijo decidido al crearlo y la lista puede crecer y encoger. En la práctica depende del lenguaje: en C y Java los arrays básicos son fijos, mientras que la lista de Python y el Array de JavaScript crecen solos. En todos, leer una posición es inmediato y insertar en medio obliga a desplazar el resto.

¿Cómo se recorre un array?

Con un bucle PARA cuyo contador va de 0 hasta la longitud menos uno y se usa como índice, o con la forma «para cada elemento» que ofrecen la mayoría de lenguajes modernos (for x in lista en Python, for (const x of lista) en JavaScript), que no necesita manejar el índice y evita salirse del array.