## Processing Community Day 2023 @ Brasil # Python científico na programação criativa: o que eu aprendi até agora de numpy para usar nos meus desenhos ### `https://hackmd.io/@villares/numpy-na-prog-criativa` ### [`gravação da apresentação`](https://www.youtube.com/live/bURqaO8Sbhw?si=M83DC-i1PNYtx6Wk&t=178) Quem é esse [Alexandre](https://abav.lugaralgum.com)? É aquele maluco que fica fazendo [material didático aberto de programação com Processing + Python (py5)](https://abav.lugaralgum.com/material-aulas/), ajuda a organizar com o John a [Noite de Processing](https://garoa.net.br/wiki/Noite_de_Processing), e faz [um desenho por dia](https://github.com/villares/sketch-a-day)! - Me encontrem no Mastodon: - https://ciberlandia.pt/@villares - https://pynews.com.br/@villares ## Caveat: eu não manjo de numpy de verdade! - Estou começando a aprender sobre numpy, e pensei em escrever sobre as minhas motivações e aprendizados (aprendendo em públio): [Numpy para leigos, contado por um leigo](https://hackmd.io/@villares/numpy-para-leigos) ### Motivações - Uma das minhas palestras prediletas: **The Unexpected Effectiveness of Python in Science** - Jake vanderPlas conta como ciência moderna dependem de numpy e scipy, em especial ele fala da astronomia - https://www.youtube.com/watch?v=ZyjCqQEUa8o - https://speakerdeck.com/jakevdp/the-unexpected-effectiveness-of-python-in-science - ![image](https://hackmd.io/_uploads/ByaO7W_B6.png) - ![image](https://hackmd.io/_uploads/Sk4kNWuHp.png) - ![image](https://hackmd.io/_uploads/Symc4-_Bp.png) - Veja atambém, o ["Tour furacão do Python"](https://jakevdp.github.io/WhirlwindTourOfPython/) (é redemoinho na real) ### Referências #### Livro [From Python to Numpy](https://www.labri.fr/perso/nrougier/from-python-to-numpy/) do Nicolas Rougier - É praticamente um port do [Nature of Code](https://natureofcode.com) do Shiffman para Python com Numpy - Brincadeiras a parte: - Começa com random walker - Tem autômatos celulares / Conway's Game of Life - Tem fractais - Tem o Flocking #### A documentação oficial do [numpy](https://numpy.org/pt/) - Tem em português! #### A ferramenta que eu uso de Processing + Python: [py5](https://py5coding.org) - [O que é e como instalar o py5](https://abav.lugaralgum.com/como-instalar-py5/) - Tutoriais de vetorização no py5 do Jim - https://ixora.io/blog/vectorization-and-numpy/ - https://py5coding.org/how_tos/generate_noise_values.html ### O básico do básico do básico - O que são arrays? - coleções homogêneas de valores, úteis para representar vetores e matrizes, capazes de fazer operações entre vetores, matrizes e valores escalares. - um pouco do açucar sintático do Python - Sobrecarga dos operadores com valores escalares fazendo as operações em cada elemento do array. ``` >>> numeros = [10, 20, 30, 1, 2, 3] # lista comum >>> npa = np.array(numeros) # array numpy >>> npa * 3 + 1 >>> array([31, 61, 91, 4, 7, 10]) ``` - Fatias com `[]` e `:` - A idéia das máscaras: - `mascara = npa < 4` é um array com valores `True` e `False`. - `npa[mascara] = 0` indexando pela máscara permite alterar o array original só nas posições da máscara. - [mais alguns exemplos bem simples](https://hackmd.io/@villares/numpy-para-leigos#Algumas-ideias-iniciais) ### Mas pra que é que você usa? #### Imagens No py5, Pillow e OpenCV - [Contando pixels de uma cor](https://github.com/villares/sketch-a-day/tree/main/2023/sketch_2023_11_30) > ![](https://github.com/villares/sketch-a-day/blob/main/2023/sketch_2023_11_30/sketch_2023_11_30.png?raw=true) - [Ruído aleatório maneiro do Tom Larrow (Tom Larrow's nice random noise)](https://github.com/villares/sketch-a-day/blob/main/2023/sketch_2023_01_27/sketch_2023_01_27.py) > ![image](https://hackmd.io/_uploads/H17nu3ura.png) - [Exemplo Thresholds](https://github.com/villares/sketch-a-day/tree/main/2023/sketch_2023_07_24) - [Glitch](https://github.com/villares/sketch-a-day/blob/main/2023/sketch_2023_07_28/sketch_2023_07_28.py) > ![](https://github.com/villares/sketch-a-day/blob/main/2023/sketch_2023_07_28/output.gif?raw=true) - [Exemplo OpenCV](https://github.com/villares/sketch-a-day/blob/main/2023/sketch_2023_04_13/sketch_2023_04_13.py) > ![image](https://hackmd.io/_uploads/S1_MYnOSa.png) #### Particulas / Agentes / Operações vetorizadas - [Game of Life](https://abav.lugaralgum.com/material-aulas/Processing-Python-py5/automatos-celulares.html#gol-com-numpy) > ![image](https://hackmd.io/_uploads/rkIVo2_BT.png) - Calculando pontos de uma curva [[1]](https://github.com/villares/sketch-a-day/tree/main/2023/sketch_2023_08_06) e [[2]](https://github.com/villares/sketch-a-day/blob/main/2023/sketch_2023_08_10/sketch_2023_08_10.py) - O Processing não tem um `quadraticVertex()` como tem o `bezierVertex()`, para pegar os pontos de um forma feita com vértices quadráticos (para depois poder usar com **`shapely`**) ```python def quadratic_points(ax, ay, bx, by, cx, cy, num_points=None, first_point=False): if num_points is None: num_points = int(py5.dist(ax, ay, bx, by) + py5.dist(bx, by, cx, cy) + py5.dist(ax, ay, cx, cy)) // 10 if num_points <= 2: return [(ax, ay), (cx, cy)] if first_point else [(cx, cy)] t = np.arange(0 if first_point else 1, num_points + 1) / num_points x = (1 - t) * (1 - t) * ax + 2 * (1 - t) * t * bx + t * t * cx y = (1 - t) * (1 - t) * ay + 2 * (1 - t) * t * by + t * t * cy return np.column_stack((x, y)) ``` - [Simulador de Areia](https://github.com/villares/sketch-a-day/blob/main/2023/sketch_2023_05_22/sketch_2023_05_22.py) > ![image](https://hackmd.io/_uploads/Syvlc3uBp.png) - [Pattern binário](https://github.com/villares/sketch-a-day/blob/main/2023/sketch_2023_05_29/sketch_2023_05_29.py) > ![image](https://hackmd.io/_uploads/Hk_Nk0_B6.png) - Perlin Noise vetorizado - Mais sobre [Perlin Noise](https://abav.lugaralgum.com/material-aulas/Processing-Python-py5/noise.html) - [Perlin Noise 1](https://raw.githubusercontent.com/villares/sketch-a-day/main/2023/sketch_2023_02_07/tom_noise.py) - [Perlin Noise 2](https://github.com/villares/sketch-a-day/tree/main/2023/sketch_2023_02_12) - [O exemplo 3D do tutorial do Jim](https://github.com/villares/sketch-a-day/blob/main/2022/sketch_2022_08_22/sketch_2022_08_22.py) > ![image](https://hackmd.io/_uploads/SJzIKn_Bp.png) - [Retícula vetorizada](https://github.com/villares/sketch-a-day/blob/main/2023/sketch_2023_02_04/sketch_2023_02_04.py) > ![image](https://hackmd.io/_uploads/HyCHcnOST.png) - [Perlin Noise com bandas](https://github.com/villares/sketch-a-day/blob/main/2023/sketch_2023_02_13/sketch_2023_02_13.py) > ![image](https://hackmd.io/_uploads/HJ4xc9OH6.png) - Exemplo de Partículas [ingênuas](https://github.com/villares/sketch-a-day/tree/main/2023/sketch_2023_03_14) > ![image](https://hackmd.io/_uploads/HkUfq2uBT.png) - [Exemplo de Flocking](https://github.com/villares/sketch-a-day/blob/main/2023/sketch_2023_11_23/sketch_2023_11_23.py) > ![image](https://hackmd.io/_uploads/SJbV5n_BT.png)