## 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
- 
- 
- 
- 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)
> 
- [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)
> 
- [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)
> 
- [Exemplo OpenCV](https://github.com/villares/sketch-a-day/blob/main/2023/sketch_2023_04_13/sketch_2023_04_13.py)
> 
#### Particulas / Agentes / Operações vetorizadas
- [Game of Life](https://abav.lugaralgum.com/material-aulas/Processing-Python-py5/automatos-celulares.html#gol-com-numpy)
> 
- 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)
> 
- [Pattern binário](https://github.com/villares/sketch-a-day/blob/main/2023/sketch_2023_05_29/sketch_2023_05_29.py)
> 
- 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)
> 
- [Retícula vetorizada](https://github.com/villares/sketch-a-day/blob/main/2023/sketch_2023_02_04/sketch_2023_02_04.py)
> 
- [Perlin Noise com bandas](https://github.com/villares/sketch-a-day/blob/main/2023/sketch_2023_02_13/sketch_2023_02_13.py)
> 
- Exemplo de Partículas [ingênuas](https://github.com/villares/sketch-a-day/tree/main/2023/sketch_2023_03_14)
> 
- [Exemplo de Flocking](https://github.com/villares/sketch-a-day/blob/main/2023/sketch_2023_11_23/sketch_2023_11_23.py)
> 