294 lines
7.8 KiB
Python
294 lines
7.8 KiB
Python
# -*- 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) |