Aula 23

Tarefa 11 (iterator)

Poucos alunos submeteram a tarefa 11 e muitos deles propuseram soluções total ou parcialmente erradas.

Algumas soluções

def desigual(a,b):
    while True:
        xa = next(a)
        xb= next(b)
        if xa==xb:
            yield (xa,xb)

-- o zip funciona para iterators

def desigual(a,b)
    for xa,xb in zip(a,b)
        if xa==xb:
            yield (xa,xb)
            

class desigual:
    def __init__(self,a,b):
        self.a=a
        self.b=b
    def __iter__(self):
        return self
    def __next__(self):
        while True
            xa = next(self.a)
            xb = next(self.b)
            if xa==xb:
                return (xa,xb)
            
  1. Note o return na classe desigual (e nao yield)

  2. nao precisa tratar da exceção stopIteraction. Se ela aconteces no next e voce nao tratar dela, ela sobe, e isso é examente o que vc quer - quem esta chamando seu iterator recebe o stopIteraction.

Em particular alguns fizeram isso

def desigual(a,b)
    try:
      for xa,xb in zip(a,b)
         if xa==xb:
             yield (xa,xb)
    except stopIteration:
      pass

que é o que vc nao quer fazer - voce mata a exceção que veio do next mas nao avisa que esta usando o seu iterator.

  1. alguns erros

Nao use seu proprio loop para processar arrays em numpy

indexação avançada

Rodar in ipython

import numpy as np

def g1():
    global x
    for i in range(x.shape[0]):
        for j in range(x.shape[1]):
            if x[i,j] < 0.5:
                x[i,j]=0.0
    return None
    
def g2():
    global x
    x[x<0.5]=0.0
    return None
    
y = np.random.rand(4000,30)
x = np.array(y,copy=True)
%timeit g1()
x = np.array(y,copy=True)
%timeit g2()

Funções em Numpy

import numpy as np

def f1(x):
    out = np.empty(x.shape[1])
    for j in range(x.shape[1]):
        s=0
        for i in range(x.shape[0]):
            s+=x[i,j]
        out[j]=s
    return out

def f2(x): 
    return np.sum(x,axis=0)

a = np.random.rand(1000,1000)

%timeit f1(a)
%timeit f2(a)

Funções elemento por elemento

np.log

Funções element-wise

Funções que resumem

axis - faz a operação de resume através dessa dimensão - sobram as outras

a = np.arange(24).reshape(3,4,2)
a

np.sum(a,axis=0)

np.amax(a,axis=(1,2))

Junta e quebra arrays

https://numpy.org/doc/stable/reference/routines.array-manipulation.html#joining-arrays

Algebra linear

https://numpy.org/doc/stable/reference/routines.linalg.html

I/O

Formato interno para matrizes npy

Texto

csv

Loops mais complexos

de uma olhada no 4 video de https://www.youtube.com/watch?v=rN0TREj8G7U&list=PLeo1K3hjS3uset9zIVzJWqplaWBiacTEU]] que fala sobre uma função util para fazer iteração em arrays.

Cython

Extensões tipo C do python https://cython.org/

Veja a função Primes em https://cython.readthedocs.io/en/latest/src/tutorial/cython_tutorial.html

curso sobre cython https://nyu-cds.github.io/python-cython/

Ha poucos sites discutindo cython + numpy

Exercicios