Clone Numpy

gambar

Modul kecil untuk bekerja dengan array di Python tanpa menggunakan perpustakaan pihak ketiga (klon NumPy, tetapi hanya dalam Python murni).

Pekerjaan rumah di universitas diminta untuk menulis sebuah program yang menghitung norma dan dekomposisi dari matriks, tetapi dilarang untuk menggunakan perpustakaan pihak ketiga. Pilihan bahasa pemrograman tidak terbatas. Saya memilih python (yang merupakan kesalahan, karena jauh lebih lambat daripada Java dan C / C ++) dan karenanya saya tidak bisa menggunakan NumPy. Dalam prosesnya, saya harus menulis fungsi untuk melakukan operasi dengan array, fungsi untuk menemukan anak di bawah umur, penentu, dll. Hasilnya adalah perpustakaan mini untuk bekerja dengan array.

Kode python murni saya jauh lebih lambat daripada NumPy, yang menghitung C dan Fortran (ditambah kode saya tidak dioptimalkan).

Apa yang bisa MatLOL:

  • Jumlah, perbedaan, dan produk matriks
  • Produk matriks dengan nomor
  • Matriks Transpose
  • Matriks minor
  • Penentu matriks
  • Matriks terbalik
  • Matriks gabungan
  • Nomor kondisi matriks
  • Yang pertama, kedua (tidak difinalisasi), norma-norma Euclidean dan matriks tak terbatas
  • Solusi dari persamaan AX = B
  • Dekomposisi LU
  • Dekomposisi Cholesky
  • Metode Seidel

Contoh MathLOL


Impor modul:

# from mathlol import * from mathlol import mathlol 

Inisialisasi matriks

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

Beberapa operasi matriks

 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]]) #   

Ada juga fungsi untuk bekerja dengan vektor

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

Contoh lainnya

Kinerja MathLOL


Mari kita lihat kecepatan produk komputasi dari matriks ukuran NxN. Matriks diisi dengan bilangan bulat acak dari -100 hingga 100.

Kode
 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(" ()") 


gambar

Kecepatan menghitung ukuran produk matriks dari 100x100 hingga 1000x1000

gambar

Bandingkan kecepatan komputasi numpy dan mathlol. Sayangnya, mathlol sangat lambat dalam kecepatan dan saya memutuskan untuk mengambil matriks untuk ukuran matriks numpy dari 100x100 ke 1000x1000, dan untuk mathlol dari 10x10 hingga 100x100.

gambar

MathLOL menghitung produk dari matriks 100x100 dengan sendirinya dalam 0,16 detik, dan NumPy menghitung produk dari matriks 1000x1000 dengan sendirinya dalam 0,002 (!!!) detik. Perbedaannya sangat besar.

Tugas kami hanyalah mengimplementasikan berbagai fungsi untuk bekerja dengan matriks, yang kami lakukan, tetapi program dengan matriks besar tidak bekerja secepat yang kami inginkan. Tetap memperbaiki program, menambahkan beberapa fungsi lagi (misalnya, fungsi untuk menghitung angka Todd), saya akan berterima kasih jika Anda melihat kode, menunjukkan kesalahan, dan mungkin membantu memperbaiki kode.

Itu saja, kode dan contoh diposting di github .

PS Dalam proses menulis artikel, saya ingin bereksperimen dan menanamkan C / C ++ dalam modul saya. Saya akan mengurus ini dalam waktu dekat dan melihat seberapa dekat dengan kinerja NumPy.

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


All Articles