26
ICE-B 8 - Matrizes (Numpy) Ludwig Krippahl

8 - Matrizes (Numpy) - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-08.pdf · Formato original tem menos funcionalidades (lista de tuplos) • O array Numpy permite

Embed Size (px)

Citation preview

Page 1: 8 - Matrizes (Numpy) - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-08.pdf · Formato original tem menos funcionalidades (lista de tuplos) • O array Numpy permite

ICE-B

8 - Matrizes (Numpy)

Ludwig Krippahl

Page 2: 8 - Matrizes (Numpy) - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-08.pdf · Formato original tem menos funcionalidades (lista de tuplos) • O array Numpy permite

1

Matrizes

Resumo■ Vectores e matrizes com a biblioteca Numpy■ Operações com broadcasting■ Indexação com booleanos■ Exemplos: notas de ICE e tamanho de uma proteína

Page 3: 8 - Matrizes (Numpy) - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-08.pdf · Formato original tem menos funcionalidades (lista de tuplos) • O array Numpy permite

2

Matrizes

O array Numpy

Page 4: 8 - Matrizes (Numpy) - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-08.pdf · Formato original tem menos funcionalidades (lista de tuplos) • O array Numpy permite

3

Arrays

Matrizes com a biblioteca Numpy■ Os objectos ndarray guardam matrizes n-dimensionais■ Podem ser criados de várias maneiras:

In : import numpy as np # as permite dar outro nome ao objecto In : vec = np.ones(5) # matriz (ou vector) preenchido a 1 Out: array([1., 1., 1., 1., 1.]) In : mat = np.zeros( (5,5) ) # matriz (ou vector) preenchido a 0 Out: # o tamanho é dado num tuplo array([[0., 0., 0., 0., 0.], [0., 0., 0., 0., 0.], [0., 0., 0., 0., 0.], [0., 0., 0., 0., 0.], [0., 0., 0., 0., 0.]]) mat2 = np.array( [ [1,2,3],[4,5,6] ] ) Out: array([[1, 2, 3], [4, 5, 6]])

Page 5: 8 - Matrizes (Numpy) - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-08.pdf · Formato original tem menos funcionalidades (lista de tuplos) • O array Numpy permite

4

Arrays

Matrizes com a biblioteca Numpy■ Os objectos ndarray guardam matrizes n-dimensionais• O atributo shape é um tuplo com as dimensões• O tipo de valores guardado é determinado automaticamente• O método astype devolve uma cópia do tipo indicado

In : vec1 = np.array([1,2,3]) In : vec1.dtype Out: dtype('int64') In : vec2 = np.array([1.0,1.5,2.0])Out: array([1. , 1.5, 2. ]) In : vec2.dtype Out: dtype('float64') In : vec2.shape Out: (3,)

In : vec2.astype(int) Out: array([1, 1, 2]) mat = np.array([[1,2],[3,4],[5,6]])In : mat.shape Out: (3, 2) In : mat Out: array([[1, 2], [3, 4], [5, 6]])

Page 6: 8 - Matrizes (Numpy) - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-08.pdf · Formato original tem menos funcionalidades (lista de tuplos) • O array Numpy permite

5

Arrays

Matrizes com a biblioteca Numpy■ Os objectos ndarray "difundem" as operaçoes (broadcasting)• Alinha as dimensões dos operandos começando pela última

• Correspondem tiverem o mesmo comprimento ou comprimento 1

In : mat1=np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]]) In : mat1/2 array([[0.5, 1. , 1.5, 2. ], [2.5, 3. , 3.5, 4. ], [4.5, 5. , 5.5, 6. ]]) In : mat1 + 5 array([[ 6, 7, 8, 9], [10, 11, 12, 13], [14, 15, 16, 17]]) In : mat1 + [5,10,15,20] array([[ 6, 12, 18, 24], [10, 16, 22, 28], [14, 20, 26, 32]])

Page 7: 8 - Matrizes (Numpy) - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-08.pdf · Formato original tem menos funcionalidades (lista de tuplos) • O array Numpy permite

6

Arrays

Matrizes com a biblioteca Numpy■ A biblioteca numpy implementa muitas funções úteis para matrizes

In : mat1=np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]]) Out: array([[ 1, 2, 3, 4], [ 5, 6, 7, 8], [ 9, 10, 11, 12]]) In : np.sum(mat1) Out: 78 In : np.mean(mat1) Out: 6.5 In : np.std(mat1) Out: 3.452052529534663 In : np.max(mat1) Out: 12 In : np.min(mat1) Out: 1

Page 8: 8 - Matrizes (Numpy) - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-08.pdf · Formato original tem menos funcionalidades (lista de tuplos) • O array Numpy permite

7

Arrays

Matrizes com a biblioteca Numpy■ Podem ser usadas numa direcção, especificada por axis

In : mat1=np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]]) Out: array([[ 1, 2, 3, 4], [ 5, 6, 7, 8], [ 9, 10, 11, 12]]) In : np.max(mat1,axis=0) Out: array([ 9, 10, 11, 12]) In : np.max(mat1,axis=1) Out: array([ 4, 8, 12]) In : np.sum(mat1,axis=1) Out: array([10, 26, 42]) In : np.mean(mat1,axis=0) Out: array([5., 6., 7., 8.]) In : np.mean(mat1,axis=1) Out: array([ 2.5, 6.5, 10.5])

Page 9: 8 - Matrizes (Numpy) - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-08.pdf · Formato original tem menos funcionalidades (lista de tuplos) • O array Numpy permite

8

Argumentos opcionais

Parâmetros podem ter valores por omissão■ Para esses, os argumentos são opcionais

def test_size(number, min_val=1, max_val=10): "tests if number is large, medium or small" if number > max_val: return 'Large!' elif number < min_val: return 'small...' else: return 'Medium.'

In : test_size(5) Out: 'Medium.' In : test_size(5,6) Out: 'small...' In : test_size(5,1,4) Out: 'Large!'

Page 10: 8 - Matrizes (Numpy) - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-08.pdf · Formato original tem menos funcionalidades (lista de tuplos) • O array Numpy permite

9

Argumentos opcionais

Qualquer argumento pode ser passado pelo nome■ Restrição: argumentos por posição têm de vir primeiro

def test_size(number, min_val=1, max_val=10): "tests if number is large, medium or small" if number > max_val: return 'Large!' elif number < min_val: return 'small...' else: return 'Medium.'

In : test_size(15, max_val=20) Out: 'Medium.' In : test_size(15, max_val=200, min_val=100) Out: 'small...' In : test_size(max_val = 10, min_val = 0, number = 20) Out: 'Large!'

Page 11: 8 - Matrizes (Numpy) - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-08.pdf · Formato original tem menos funcionalidades (lista de tuplos) • O array Numpy permite

10

Arrays

Matrizes com a biblioteca Numpy■ Podem ser usadas numa direcção, especificada por axis

In : mat1=np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]]) Out: array([[ 1, 2, 3, 4], [ 5, 6, 7, 8], [ 9, 10, 11, 12]]) In : np.max(mat1,axis=0) Out: array([ 9, 10, 11, 12]) In : np.max(mat1,axis=1) Out: array([ 4, 8, 12]) In : np.sum(mat1,axis=1) Out: array([10, 26, 42]) In : np.mean(mat1,axis=0) Out: array([5., 6., 7., 8.]) In : np.mean(mat1,axis=1) Out: array([ 2.5, 6.5, 10.5])

Page 12: 8 - Matrizes (Numpy) - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-08.pdf · Formato original tem menos funcionalidades (lista de tuplos) • O array Numpy permite

11

Matrizes

Exemplo: Diâmetro de uma proteína

Page 13: 8 - Matrizes (Numpy) - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-08.pdf · Formato original tem menos funcionalidades (lista de tuplos) • O array Numpy permite

12

Diâmetro de uma proteína

Desulforedoxina, de D. gigas■ File protein.py tem variável com coordenadas (~520 átomos):

coords_1dxg=[ (2.947, 31.497, 15.827), (4.159, 30.906, 16.375), (5.262, 30.978, 15.333), (4.988, 31.483, 14.245), ... (-5.508, 25.661, 2.712), (-4.744, 20.784, -0.064)]

■ Decomposição original:• Calcular distância entre dois pontos (em 3D)• Calcular maior distância entre um conjunto de pontos e um ponto

• Calcular maior distância entre todos os pontos

Page 14: 8 - Matrizes (Numpy) - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-08.pdf · Formato original tem menos funcionalidades (lista de tuplos) • O array Numpy permite

13

Diâmetro de uma proteína

Usando ndarray podemos simplificardef diameter(coords): "compute diameter of structure given by coords" c_mat = np.array(coords) # convert to numpy array diam = 0 for row in range(c_mat.shape[0]-1): reference = c_mat[row,:] dists = np.sqrt(np.sum( (c_mat[row+1:,:]-reference)**2, axis=1) ) max_d = np.max(dists) if max_d > diam: diam = max_d return diam

■ Formato original tem menos funcionalidades (lista de tuplos)• O array Numpy permite indexar e fazer slicing em cada dimensão

In : mat_l=[[1,2,3],[4,5,6]] In : mat_l[0][2] Out: 3

In : mat_a = np.array(mat_l) In : mat_a[0,2] Out: 3

Page 15: 8 - Matrizes (Numpy) - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-08.pdf · Formato original tem menos funcionalidades (lista de tuplos) • O array Numpy permite

14

Diâmetro de uma proteína

Usando ndarray podemos simplificardef diameter(coords): "compute diameter of structure given by coords" c_mat = np.array(coords) diam = 0 for row in range(c_mat.shape[0]-1): reference = c_mat[row,:] #distâncias ao ponto de referência dists = np.sqrt(np.sum( (c_mat[row+1:,:]-reference)**2, axis=1) ) max_d = np.max(dists) #máximo das distâncias if max_d > diam: diam = max_d return diam

■ Matriz de Nx3, broadcasting c_mat[row+1:,:]-reference■ Calcula soma dos quadrados das diferenças, 1 valor por linha■ O máximo é obtido com a função np.max

Page 16: 8 - Matrizes (Numpy) - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-08.pdf · Formato original tem menos funcionalidades (lista de tuplos) • O array Numpy permite

15

Matrizes

Exemplo: notas de ICE

Page 17: 8 - Matrizes (Numpy) - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-08.pdf · Formato original tem menos funcionalidades (lista de tuplos) • O array Numpy permite

16

notas de ICE

Versão 1, vectorizar cálculos intermédiosdef final_grades(grade_list): """ compute final grade for a single student grades are two practical assignments and two tests """ grades = np.array(grade_list) comp_tp = np.round(grades[:,3]*0.4+grades[:,4]*0.6,1) comp_l = np.round((grades[:,1]+grades[:,2])/2,1) freq = np.max(grades[:,1:3],axis=1) final = np.zeros((grades.shape[0],2)) final[:,0]=grades[:,0] for ix in range(final.shape[0]): if freq[ix]<9.5: final[ix,1]=-1 elif comp_tp[ix]<8.0: final[ix,1]= np.round(comp_tp[ix]) else: final[ix,1]= np.round(comp_tp[ix]*0.6+comp_l[ix]*0.4) return final

■ O round do Numpy funciona com ndarray

Page 18: 8 - Matrizes (Numpy) - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-08.pdf · Formato original tem menos funcionalidades (lista de tuplos) • O array Numpy permite

17

notas de ICE

Versão 1, vectorizar cálculos intermédiosdef final_grades(grade_list): """ compute final grade for a single student grades are two practical assignments and two tests """ grades = np.array(grade_list) comp_tp = np.round(grades[:,3]*0.4+grades[:,4]*0.6,1) comp_l = np.round((grades[:,1]+grades[:,2])/2,1) freq = np.max(grades[:,1:3],axis=1) final = np.zeros((grades.shape[0],2)) final[:,0]=grades[:,0] for ix in range(final.shape[0]): if freq[ix]<9.5: final[ix,1]=-1 elif comp_tp[ix]<8.0: final[ix,1]= np.round(comp_tp[ix]) else: final[ix,1]= np.round(comp_tp[ix]*0.6+comp_l[ix]*0.4) return final

9.0 14.2 8.2 11.3 13.2 12.2 ...

13.4 7.8 11.4 16.2 3.8 9.0 ...

■ CompTP e CompL (e freq) são vectores

Page 19: 8 - Matrizes (Numpy) - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-08.pdf · Formato original tem menos funcionalidades (lista de tuplos) • O array Numpy permite

18

notas de ICE

Versão 1, vectorizar cálculos intermédiosdef final_grades(grade_list): """ compute final grade for a single student grades are two practical assignments and two tests """ grades = np.array(grade_list) comp_tp = np.round(grades[:,3]*0.4+grades[:,4]*0.6,1) comp_l = np.round((grades[:,1]+grades[:,2])/2,1) freq = np.max(grades[:,1:3],axis=1) final = np.zeros((grades.shape[0],2)) final[:,0]=grades[:,0] for ix in range(final.shape[0]): if freq[ix]<9.5: final[ix,1]=-1 elif comp_tp[ix]<8.0: final[ix,1]= np.round(comp_tp[ix]) else: final[ix,1]= np.round(comp_tp[ix]*0.6+comp_l[ix]*0.4) return final

[1000. 0.] [1001. 0.] [1002. 0.] [1003. 0.] [1004. 0.] [1005. 0.] ...

■ A variável final tem matriz para preencher

Page 20: 8 - Matrizes (Numpy) - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-08.pdf · Formato original tem menos funcionalidades (lista de tuplos) • O array Numpy permite

19

notas de ICE

Versão 1, vectorizar cálculos intermédiosdef final_grades(grade_list): """ compute final grade for a single student grades are two practical assignments and two tests """ ...

In : from assessment import grades In : final_grades(grades) Out: array([[ 1.000e+03, 1.100e+01], [ 1.001e+03, -1.000e+00], [ 1.002e+03, 9.000e+00], [ 1.003e+03, 1.300e+01], ...

■ O formato não é ideal; queremos números inteiros

Page 21: 8 - Matrizes (Numpy) - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-08.pdf · Formato original tem menos funcionalidades (lista de tuplos) • O array Numpy permite

20

notas de ICE

Versão 1, vectorizar cálculos intermédiosdef final_grades(grade_list): """ compute final grade for a single student grades are two practical assignments and two tests """ ... return final.astype(int)

In : from assessment import grades In : final_grades(grades) Out: array([[1000, 11], [1001, -1], [1002, 9], [1003, 13], ...

■ Fácil: devolver a matriz convertida para inteiros

Page 22: 8 - Matrizes (Numpy) - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-08.pdf · Formato original tem menos funcionalidades (lista de tuplos) • O array Numpy permite

21

notas de ICE

Versão 2, vectorizar tudo■ Matrizes numpy podem ser indexadas por vectores booleanos• (ou matrizes, desde que a dimensão seja correcta)

In : mat1=np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]]) Out: array([[ 1, 2, 3, 4], [ 5, 6, 7, 8], [ 9, 10, 11, 12]]) In : vec = np.array([1,2,3]) Out: array([1, 2, 3]) In : vec>1 Out: array([False, True, True]) In : mat1[vec>1,:] Out: array([[ 5, 6, 7, 8], [ 9, 10, 11, 12]]) In : mat1[mat1>4] Out: array([ 5, 6, 7, 8, 9, 10, 11, 12])

Page 23: 8 - Matrizes (Numpy) - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-08.pdf · Formato original tem menos funcionalidades (lista de tuplos) • O array Numpy permite

22

notas de ICE

Versão 2, vectorizar tudodef final_grades(grade_list): """ compute final grade for a single student grades are two practical assignments and two tests """ grades = np.array(grade_list) comp_tp = np.round(grades[:,3]*0.4+grades[:,4]*0.6,1) comp_l = np.round((grades[:,1]+grades[:,2])/2,1) freq = np.max(grades[:,1:3],axis=1) final = np.zeros((grades.shape[0],2)) final[:,0] = grades[:,0] final[:,1] = np.round(0.4*comp_l+0.6*comp_tp) final[comp_tp<8,1] = np.round(comp_tp[comp_tp<8]) final[freq<9.5,1] = -1 return final.astype(int)

■ Nota: neste caso temos de inverter a ordem dos cálculos:• Primeiro final, depois CompTP, e depois frequência

Page 24: 8 - Matrizes (Numpy) - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-08.pdf · Formato original tem menos funcionalidades (lista de tuplos) • O array Numpy permite

23

Matrizes

Resumo

Page 25: 8 - Matrizes (Numpy) - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-08.pdf · Formato original tem menos funcionalidades (lista de tuplos) • O array Numpy permite

24

Matrizes

Resumo■ Matrizes e vectores: ndarray■ Permitem broadcasting de operações e atribuição■ Permitem indexação por linha ou coluna, e com booleanos■ ExemplosLeitura adicional:■ Recomendada: Capítulo 8 dos apontamentos■ Opcional (mais matéria do que cobrimos aqui):• Numpy, quickstart tutorial:

• https://docs.scipy.org/doc/numpy-dev/user/quickstart.html

Page 26: 8 - Matrizes (Numpy) - iceb.ssdi.di.fct.unl.pticeb.ssdi.di.fct.unl.pt/1718/files/ICE-B-08.pdf · Formato original tem menos funcionalidades (lista de tuplos) • O array Numpy permite