1

Cómo sumar dos matrices de las mismas dimensiones en Python

Hola! Si a ti como a mí te apasiona la programación y las matemáticas, encontrarás interesante este programa realizado en Python que involucra un tema demasiado interesante del Algebra Lineal: Las matrices.
Representación de matriz

La matrices son un conjunto bidimensional de números o símbolos distribuidas de forma rectangular, en lineas verticales y horizontales, de manera que sus elementos se organizan en filas y columnas.
En este caso particular a sumar dos matrices que tengas las mismas dimensiones en filas y columnas. Por ejemplo, la matriz A tiene 3 filas y 3 columnas, entonces decimos que la dimensión de la matriz es 3x3 (tres por tres), por lo tanto la matriz B, tambien debe ser 3x3 para poder sumar cada uno de los items en las mismas posiciones en la matriz A y la matriz B.

¡Comencemos!

  1. Lo primero que necesitamos hacer es declarar nuestras matrices, garantizando que tienen las mismas dimensiones una respecto a la otra:
matriz1 = [
    [1,2,3], 
    [4,5,6]
]

matriz2 = [
    [1,1,1], 
    [1,1,1]
]
  1. Luego vamos a validar que las filas sean las mismas para ambas matrices con la funcion len
iflen(matriz1) == len(matriz2):
    #TODO
else:
    print('Las matrices tienen diferente numero de filas y deben ser iguales')
  1. Despues de validar las filas, debemos validar que cada matriz tenga el mismo número de columnas por cada fila. Para ello decidí crear una función que recibe como parametro la matriz:
defcolumns_len_equals(matriz):
    rows_len_equals = False
    init_long = len(matriz[0])
    for e in range(len(matriz)):
        long = len(matriz[e])
        if(init_long == long):
            rows_len_equals = Trueelse:
            rows_len_equals = Falsereturn rows_len_equals 

Aqui estamos declarando una variable booleana que iniciamos en False que va a ser la encargada de definir finalmente si todas las filas de la matriz tienen el mismo número de elementos (True) o no (False).
Luego definimos una variable inicial para recuperar la longitud de la primera fila de la matriz para posteriormente entrar en el ciclo for e iterar cada uno de los elementos para obtener la longitud de cada uno y comparar con ese valor inicial. Si alguna fila de la matriz tiene un número de elementos diferente al de la primera fila, el método retornara un booleano False, de lo contrario, si todos los elementos tienen la misma longitud, retornara un booleano True.
Este booleano de retorno nos va a ser muy útil mas adelante.

  1. ¡Ahora sí! Ya tenemos listas las validaciones de filas y de columnas, con esto aseguramos que las dos matrices tengan las mismas dimensiones. Es momento de sumar las dos matrices. Para ello, creamos una función nueva que recibe como parametros a la matriz 1 y a la matriz 2:
def add_matrices(m1, m2):
    final_matriz = []
    for index inrange(len(m1)):
        row_m1 = m1[index]
        row_m2 = m2[index]
        result_row = []
        for index2 inrange(len(row_m1)):
            result = row_m1[index2] + row_m2[index2]
            result_row.append(result)

        final_matriz.append(result_row)
    return final_matriz

En esta función iniciamos declarando una lista vacia que es donde vamos a ir almacenando los resultados de cada fila luego de las sumas.
Posterior a ello, creamos un ciclo for anidado donde iniciamos iterando por el index de la matriz 1 (aqui puede ser tambien la matriz 2 ya que ambas tienen la misma cantidad de elementos) y capturamos la misma fila de cada matriz. Luego necesitamos iterar cada uno de los elementos de una de las filas de las dos matrices (yo elegi la fila de la matriz 1 pero puede ser la fila de la matriz 2 ya que tienen la misma longitud).
Estando en el segundo ciclo for, y en base al index de este ciclo, sumamos tanto el elemento de la fila de la matriz 1 como el elemento de la matriz 2 y asi es como alamacenamos el resultado en una lista temporar llamada result_row.
Al finalizar de sumar los elementos respectivos de cada una de las filas, almacenamos esa fila resultante (lista result_now) en la variable declarada inicialmente final_matriz, con ello vamos sumando los elementos de cada una de las filas y las vamos almacenando en una lista final o matriz final, que finalmente es la variable que es retornada en esta funcion.

  1. Por último completemos el espacio donde dice TODO del paso 2
#Validar longitud de filasif len(matriz1) == len(matriz2):
    
    #Validar longitud de las columnasif(columns_len_equals(matriz1) and columns_len_equals(matriz2)):
        final_matriz = add_matrices(matriz1, matriz2)
        print('=> Matriz final')
        print(final_matriz)
    else:
        print('Las listas de una de las dos matrices tiene diferente longitud y deben ser iguales')
else:
    print('Las matrices tienen diferente numero de filas y deben ser iguales')

De esta manera tenemos un condicional if anidado que nos permite validar que ambas matrices tengan la misma cantidad de columnas (o elementos) en cada una de sus filas (o listas). En caso afirmativo, se suman las matrices y se imprime la matriz final. En caso negativo se imprime un mensaje indicando que las columas de una de las dos matrices o de ambas, todas no tienen la misma longitud.

  1. Finalmente dejare el programa completo y un resultado de una ejecución:

Programa completo

defcolumns_len_equals(matriz):
    rows_len_equals = False
    init_long = len(matriz[0])
    for e in range(len(matriz)):
        long = len(matriz[e])
        if(init_long == long):
            rows_len_equals = Trueelse:
            rows_len_equals = Falsereturn rows_len_equals 

defadd_matrices(m1, m2):
    final_matriz = []
    for index in range(len(m1)):
        row_m1 = m1[index]
        row_m2 = m2[index]
        result_row = []
        for index2 in range(len(row_m1)):
            result = row_m1[index2] + row_m2[index2]
            result_row.append(result)

        final_matriz.append(result_row)
    return final_matriz

matriz1 = [
	[1,2,3], 
	[4,5,6]
]

matriz2 = [
  [1,1,1], 
	[1,1,1]
]

#Validar longitud de filasif len(matriz1) == len(matriz2):
    
    #Validar longitud de las columnasif(columns_len_equals(matriz1) and columns_len_equals(matriz2)):
        final_matriz = add_matrices(matriz1, matriz2)
        print('=> Matriz final')
        print(final_matriz)
    else:
        print('Las listas de una de las dos matrices tiene diferente longitud y deben ser iguales')
else:
    print('Las matrices tienen diferente numero de filas y deben ser iguales')

Ejecución del codigo anterior:

=> Matriz final
[[2, 3, 4], [5, 6, 7]]

Cuentame que te parecio; pensaste en una forma diferente de hacerlo o en algúna mejora para el programa. Estaré muy agradecido de tu retroalimentación.
¡Saludos! 😃

Escribe tu comentario
+ 2
1
19300Puntos
un año

Hola amigos!
Haciendo el curso de manipulación y transformación de datos con Pandas y Numpy, encontre una forma de hacer este mismo programa con Numpy, la cual requiere menos codigo.

import numpy as np

matriz1 = np.array([[1,2,3], [4,5,6]])
matriz2 = np.array([[1,1,1], [1,1,1]])

rows_m1, cols_m1 = matriz1.shape
rows_m2, cols_m2 = matriz2.shape

if(rows_m1 == rows_m2 and cols_m1 == cols_m2):
  print('La suma es => ', matriz1 + matriz2)
else:
  print('Una de las dos matrices tiene diferente longitud y deben ser iguales')

Resultadoi

La suma es =>  [[2 3 4] 
								[5 6 7]]

Fue una experiencia enriquecedora solucionar el mismo problema de dos formas.