Am adaugat materialele din săpt trecute.

This commit is contained in:
2026-03-27 21:15:27 +02:00
parent 16f3a6aaed
commit 84453a6456
23 changed files with 1634 additions and 0 deletions
+294
View File
@@ -0,0 +1,294 @@
# -*- coding: utf-8 -*-
import numpy as np
#NumPy avansat
def delimit(i):
print(" ")
print(f"-({i})-" + 48*"-")
delimit(0)#################################################################
v = np.array([1,2,3,4,5,6])
print(v[0])
print(v[2])
print(v[-1])
print(v[1:4]) # de la 1 pana inainte de 4
print(v[:3]) # pana inainte de 3
print(v[3:]) # de la 3
print(v[::2]) # pas
delimit(1)#################################################################
L = [1,2,3,4,5,6]
L[1:4] = [0,0,0] # atribuie lista; L[1:4] = 0 gresit
print(L)
v[1:4] = 0 # atribuie scalar direct
print(v)
delimit(2)#################################################################
A = np.array([[1,2,3],
[3,4,6],
[7,8,9]])
print(A)
print(A.ndim)
print(A.size)
delimit(3)#################################################################
Z = np.zeros((2,3))
O = np.ones((3,2))
I = np.eye(3)
print(A)
print(O)
print(I)
delimit(4)#################################################################
a= np.arange(1,7)
A = a.reshape(2,3)
print(a)
print(A)
delimit(5)#################################################################
A = np.array([[1,2,3],
[3,4,6],
[7,8,9]])
print(A[0,0]) # extrage element
print(A[1,2])
print(A[2,1])
print(A[1,:]) # extragere de linii; linia a doua
print(A[:, 0]) # extrage coloana 1
A = np.array([[1,2,3,4],
[5,6,7,8],
[9,10,11,12]])
print(A[0:2, 1:3]) #extrage submatrice taind 0:2 pe linii si 1:3 pe col
delimit(6)#################################################################
# Operatii cu matrice in NumPy
#A*B nu inseamna in general produs matricial
A = np.array([[1,2],
[3,4]])
B = np.array([[1,2],
[3,4]])
print(A+B)
print(A-B)
# A * B
print(A * B) # element cu element nu matricial
# A @ B
print(A @ B) # inmultire normala
# Inmultirea cu scalar
print(3 * A)
# alte operatii
print(A.T) # transpusa
print(np.linalg.inv(A)) # inversa cu .inv din sublibraria .linalg
print(A^(-1)) # matricea cu inversele per element
delimit(7)#################################################################
# Broadcasting
# combina automat array-uri cu forme diferite, extinzand implicit o dim.
# pentru a face operatia posibila
# functioneaza doar atunci cand formele array-urilor sunt compatibile
A = np.array([[1,2,3],
[4,5,6],
[7,8,9]])
v = np.array([1,2,3]) #vector linie
print(A+10) # scalarul 10 este extins la forma matricei ex. (3x3)
print(A + v) # vectorul (:1) este extins la forma 3x3 i.e adauga vectorul
# pe cate numere sunt necesare
u = np.array([[10],
[20],
[30]]) # vector coloana
print(A + u)
print(u+v) # adunare vector linie cu vector coloana
# extinde vectorul coloana in asa fel sa se potriveasca cu numarul de col
# a vectorului linie, si analog extinde vectorul inie i.e. (1x3) + (3x1) = (3x3)
# dimensiunea vec col = dim vec linie pentru ca numpy sa nu dea EROARE
# broadcasting-ul functioneaza cand dim matricilor sunt egale sau cand
# una dintre dimensiuni este 1.
delimit(8)#################################################################
A = np.array([[1, 2, 3],
[4, 5, 6]])
print(np.sum(A))
print(np.min(A))
print(np.max(A))
print(np.mean(A))
# functiile de mai sus se fac cu toate elementele matricei
#sume pe linie sau coloana
print(np.sum(A, axis=0)) #return matrice cu sume per coloane
print(np.sum(A, axis=1)) #return matrice cu sume per linii
print(np.mean(A, axis=0)) #return matrice cu medii per coloane
print(np.mean(A, axis=1)) #return matrice cu medii per linii
print(np.max(A, axis=0)) #return matrice cu maxime de pe coloane
print(np.max(A, axis=1)) #return matrice cu maxime de pe linii
print(np.min(A, axis=0)) #return matrice cu minime de pe coloane
print(np.min(A, axis=1)) #return matrice cu minime de pe linii
#axis = 0 coloane
#axis = 1 linii
delimit(9)#################################################################
# A de mai sus
rang_A = np.linalg.matrix_rank(A)
print(rang_A) # merge chiar daca matricea nu e patratica; rang deltaP
A = np.array([[1,2,3],
[4,5,6],
[7,8,9]])
print(A)
det_A = np.linalg.det(A)
print(det_A)
#A_inv = np.linalg.inv(A)
#print(A_inv) # det matricei de mai sus este 0 si nu are inversa
A_2 = np.array([[1,2,1],
[4,5,6],
[7,8,9]])
det_A_2 = np.linalg.det(A_2)
print(det_A_2)
A_2_inv = np.linalg.inv(A_2)
print(A_2_inv)
rang_A_2 = np.linalg.matrix_rank(A_2)
print(f"Rangul matricei A_2 (3x3) cu determinantul {det_A_2} este {rang_A_2}")
A = np.array([[2,1],
[1,3]])
b = np.array([1,2]) #solve
print("Solutiile sistemului de ecuatii sunt: ", np.linalg.solve(A,b))
A = np.array([[1,2],
[3,4]])
A_inv = np.linalg.inv(A)
print(A @ A_inv) # inversa se face prin aproximari deci inmultirea nu o sa
# de matricea unitate;
# din acest motiv nu comparam direct matrici cu elemente de tip float folosind ==
# in schimb folosim np.allclose() sa vedem daca elementele sunt apropiate
print(A == A_inv)
A = np.array([[1,0,0],
[0,1,0],
[0,0,1]])
A_inv = np.linalg.inv(A)
print(A)
print(A_inv)
print(A.T)
simterica = np.allclose(A, A.T)
I = np.eye(A.shape[0]) # .shape() are output un tuple cu dimensiunile [0] scoate
# numarul liniilor, iar eye creaza mat. identitate de
# dimensiunea respectiva
print(I) # float-uri
print(A) # inturi
print(I == A) # elementel din matrice sunt egale intre ele => matrice 3x3 de True
print(A == A_inv) # in cazul asta e True, dar mai sus e un exemplu pentru care
# aproximarile float al inversei cu val reale a inversei ar da False
ortogonala = np.allclose(A, A_inv) # true
print(ortogonala) # matricea identitate este egala cu inversa ei
delimit(10)#################################################################
a = np.array([1,2,7,1,9,5,8,9])
print(a)
print(np.where(a == 1)) # vector print unde el. = 1
A = np.array([[4,2,7],
[1,5,1],
[3,6,8]])
poz = np.where(A == 1)
print(A)
print(poz) # pozitiile pentru care elementul din a este 1
print(poz[0]) # randurile pe care se gasesc
print(poz[1]) # coloanele pe care se gasesc
for row, col in zip(*poz):
print(f"({row}, {col})")
# zip(*poz) face perechi element cu element din lista de tuples de tipul i,j
# altfel coordonatele sunt in doua liste separate
delimit(11)#################################################################
col = np.array([0,2,0,2,2,1])
print(np.unique(col)) # pastreaza din array doar elementele care sunt distincte
mat = np.array([[0,2,0],
[2,2,1]]) # pe matrice o forteaza intr-un vector si da return
print(np.unique(mat)) # elementelor distincte
delimit(12)#################################################################
# Problema, se da o matrice sa se determine coloanele pe care apare val min din
#matrice iar pe aceste coloane sa se adauge o constanta c. (cu np.where)
c = 10
minim = np.min(A)
linii, coloane = np.where(A == minim) #coloanele unde exista min
coloane_unice = np.unique(coloane) #elimina duplicate pentru nu a aduna c
#de doua ori
A_nou = A.copy()
A_nou[:, coloane_unice] += c
#^merge pe fiecare linie pe coloanele din vectorul de coloane unice
print("Minimul:", minim)
print("Linii: ", linii)
print("Coloane: ", coloane)
print("Coloane distincte:", coloane_unice)
delimit(13)#################################################################
# Se da o matrice A. Sa se determine coloanele in care apare valoarea maxima
# din matrice , iar toate elementele de pe aceste coloane sa fie inlocuite cu 0.
maxim = np.max(A)
linii, coloane = np.where(A == maxim)
coloane_unice = np.unique(coloane)
A_nou = A.copy()
A_nou[:, coloane_unice] = 0
print("Maximul: ", maxim)
print("Coloane unice: ", coloane_unice)
print("Matricea modificata: ")
print(A_nou)