Clon Numpy

imagen

Un peque帽o m贸dulo para trabajar con matrices en Python sin usar bibliotecas de terceros (un clon NumPy, pero solo en Python puro).

Se le pidi贸 a la tarea en la universidad que escribiera un programa que calcule las normas y las descomposiciones de la matriz, pero se le prohibi贸 usar bibliotecas de terceros. La elecci贸n del lenguaje de programaci贸n no est谩 limitada. Eleg铆 python (que fue un error, porque es mucho m谩s lento que Java y C / C ++) y, en consecuencia, no puedo usar NumPy. En el proceso, tuve que escribir funciones para realizar operaciones con matrices, funciones para encontrar menores, determinantes, etc. El resultado es una mini biblioteca para trabajar con matrices.

Mi c贸digo de Python puro es mucho m谩s lento que NumPy, que hace c谩lculos de C y Fortran (adem谩s mi c贸digo no est谩 optimizado).

驴Qu茅 puede MatLOL:

  • Suma, diferencia y producto de matrices.
  • Producto matricial por n煤mero
  • Transposici贸n de matriz
  • Matriz menor
  • Matriz determinante
  • Matriz inversa
  • Matriz de la uni贸n
  • N煤mero de condici贸n de la matriz
  • La primera, segunda (no finalizada), normas de matriz euclidiana e infinita
  • Soluci贸n de la ecuaci贸n AX = B
  • Descomposici贸n LU
  • Descomposici贸n de Cholesky
  • M茅todo Seidel

Ejemplos MathLOL


Importar el m贸dulo:

# from mathlol import * from mathlol import mathlol 

Inicializaci贸n de la matriz

 matrix = mathlol() matrix.set([[1, 2, 3], [4, 5, 6], [7, -8, 9]]) matrix.get() #   

Algunas operaciones matriciales

 matrix * 2 #     2 A = [[0, 0, 0], [0, 1, 0], [0, 0, 0]] #  2  matrix.dot(A) matrix * A matrix.transposition() #   matrix.minor(i = 0, j = 0) #   matrix.determinant() #   matrix.inverse() #   L, U = matrix.lu() # LU  matrix.seidel(b = [[5.0], [9.0], [1.0]]) #   

Tambi茅n hay funciones para trabajar con vectores.

 vector = mathlol() vector.set([1, 2, 3, 4, 5]) vector.checkvector() # ,     vector.norm1_vector() vector.norm2_vector() vector.norm3_vector() 

Otros ejemplos

Rendimiento MathLOL


Veamos la velocidad de calcular productos de matrices de tama帽o NxN. Las matrices est谩n llenas de enteros aleatorios de -100 a 100.

C贸digo
 from mathlol import mathlol import time import random import matplotlib.pyplot as plt #    data = {} for i in range(10, 110, 10): array = [] for i_ in range(i): temp = [] for j_ in range(i): temp.append(random.randint(-100, 100)) array.append(temp) data[i] = array #      mlol_dot = {} for key in data.keys(): matrix = mathlol() matrix.set(matrix = data[key]) start = time.process_time() result = matrix * matrix end = time.process_time() - start mlol_dot[key] = end #   plt.plot(mlol_dot.keys(), mlol_dot.values()) plt.title("MathLOL \n ") plt.xlabel("  (NxN)") plt.ylabel(" ()") 


imagen

La velocidad de c谩lculo de tama帽os de productos de matriz de 100x100 a 1000x1000

imagen

Compare la velocidad computacional de numpy y mathlol. Desafortunadamente, el mathlol era muy lento en velocidad y decid铆 tomar matrices para tama帽os de matriz numpy de 100x100 a 1000x1000, y para mathlol de 10x10 a 100x100.

imagen

MathLOL calcul贸 el producto de la matriz 100x100 por s铆 mismo en 0.16 segundos, y NumPy calcul贸 el producto de la matriz 1000x1000 por s铆 mismo en 0.002 (!!!) segundos. La diferencia es enorme

Nuestra tarea era simplemente implementar varias funciones para trabajar con matrices, lo cual hicimos, pero el programa con matrices grandes no funciona tan r谩pido como nos gustar铆a. Queda por refinar el programa, agregar algunas funciones m谩s (por ejemplo, una funci贸n para calcular el n煤mero de Todd), le agradecer铆a si mira el c贸digo, se帽ala errores y tal vez ayuda a refinar el c贸digo.

Eso es todo, el c贸digo y los ejemplos se publican en el github .

PD: En el proceso de escribir el art铆culo, quer铆a experimentar e incrustar C / C ++ en mi m贸dulo. Me ocupar茅 de esto en un futuro pr贸ximo y ver茅 qu茅 tan cerca estar谩 del rendimiento de NumPy.

Source: https://habr.com/ru/post/477308/


All Articles