Basic Python Numpy

import numpy as np

mylist = [1, 2, 3]   # creo una lista
x = np.array(mylist)   # converto la lista in un array Numpy
y = np.array([4, 5, 6])   # creo direttamente un array Numpy
r = np.arange(36)   # array con i numeri da 0 a 35
r[0]   # primo elemento dell'array
r[0]=10   # cambio valore al primo elemento dell'array
r[-1]   # ultimo elemento dell'array
r[1:5]   # array con gli elementi dal secondo al quinto
c[3:5] = 300, 400   # cambio valore al quarto e quinto elemento
r[-4:]   # ultimi 4 elementi
r[-5::-2]   # parto dal quint'ultimo e vado fino in fondo di 2 in 2
m = numpy.array([1,2,3,4],[5,6,7,8])   # creo una nuova matrice
r.resize((6, 6))   # ridistribuisco r in una matrice 6x6
r[2,3]   # elemento 2,3 della matrice (terza riga, quarta colonna)
r[2,3:6]   # terza riga, colonne 4,5 e 6
r[:,1:3]   # secondo e terzo elemento di tutte le righe
r[1,:]   # tutte le colonne della seconda riga
r[:2, :-1]   # tutte le righe fino alla terza (non inclusa) e tutte le colonne eccetto l'ultima
r[r > 20]   # array con i soli valori di r maggiori di 20
r[r > 20] = 30   # r ma con 30 al posto dei valori maggiori di 20
n = np.arange(30)**2   # array con il quadrato dei numeri da 0 a 29
# partendo da 0 creo un array con tutti i numeri antecedenti 30 di 2 in 2 (0,2,4,...,28):
n = np.arange(0, 30, 2)
n = n.reshape(3, 5)   # ridistribuisco n (1 riga) in un array 3x5
# array di 9 valori uniformemente distanziati tra 0 e 4 (0, 0.5, 1, ..., 4)
o = np.linspace(0, 4, 9)
o.resize(3, 3)   # come reshape ma modifico direttamente l'array (reshape no)
np.ones((3, 2))   # creo nuovo array 3x2 di tutti 1
np.ones((2, 3), int)   # specifico che sono numeri interi
np.zeros((2, 3))   # creo nuovo array 2x3 di tutti 0
np.eye(3)   # array quadrato (3x3) con 1 sulla diagonale e 0 altrove
np.diag(y)   # array con [4,5,6] sulla diagonale (vedi y all'inizio) e 0 altrove
np.array([1, 2, 3] * 3)   # array risultante: [1,2,3,1,2,3,1,2,3]
np.repeat([1, 2, 3], 3)   # array risultante: [1,1,1,2,2,2,3,3,3]
np.vstack([p, 2*p])   # prendo i due array (p e 2*p) e li unisco verticalmente
np.hstack([p, 2*p])   # prendo i due array (p e 2*p) e li unisco orizzontalmente
# Posso usare +, -, *, /, ** (potenza) direttamente sugli array
x + y   # [1, 2, 3] + [4, 5, 6] = [5, 7, 9]
x + 2   # [3, 4, 5] 
x * 2   # [2, 4, 6]
x - y   # [-3, -3 , -3]
x * y   # [4, 10, 18]
x / y   # [0.25, 0.4, 0.5]
x ** 2   # [1, 4, 9]
x.dot(y)   # x per y, quindi 1*4+2*5+3*6=32
len(z)   # numero righe
z.T   # inverto righe e colonne
z.dtype   # tipo di dati degli elementi dell'array z
z = z.astype("f")   # converto gli elementi di z in float
x.sum(), np.sum(x)   # sommo tutti gli elementi
x.max()
x.min()
x.mean()
np.mean(r[:,0])   # media della prima colonna della matrice
x.median()
x.std()   # deviazione standard
x.argmax()   # posizione nell'array dell'elemento massimo (base 0)
x.argmin()
np.corrcoef(r[:,0], r[:,1])  # coefficiente di correlazione tra la prima e la seconda colonna
np.random.normal(10, 0.5, 1000)   # array di 1000 numeri random con distribuzione normale, media 10, deviazione standard 0.5
z = np.array([[7, 8, 9], [10, 11, 12]])   # creo un array multidimensionale
z.shape   # vedo la dimensione dell'array m (righe, colonne)
z[1][2]   # elemento seconda riga e terza colonna
z[0][0,1]   # array prima riga e prima e seconda colonna
z.T   # matrice trasposta di z

# NB: stesso discorso delle liste di Python, se faccio:
s = r
# e poi modifico s, si modifica anche r. Per evitarlo:
s = r.copy()


# CICLO FOR SU ARRAY

test = np.random.randint(0, 10, (4,3))   # matrice con numeri da 0 a 9
# ciclo per riga:
for row in test:
    print(row)
# ciclo per indice:
for i in range(len(test)):
    print(test[i])
# ciclo per riga e indice:
for i, row in enumerate(test):
    print('row', i, 'is', row)
# con la funzione zip posso iterare facilmente su più array:
for i, j in zip(test, test2):
    print(i,'+',j,'=',i+j)



No comments:

Post a Comment