# Getting to grips with vectorization in py5

**URL:** <https://discourse.processing.org/t/getting-to-grips-with-vectorization-in-py5/32023>\
**Category:** Gallery\
**Created:** [August 31, 2021, 10:42am UTC](https://discourse.processing.org/t/getting-to-grips-with-vectorization-in-py5/32023 "2021-08-31T10:42:14Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![monkstone](https://yyz2.discourse-cdn.com/flex036/user_avatar/discourse.processing.org/monkstone/32/64_2.png) [@monkstone](https://discourse.processing.org/u/monkstone)\
**Post date:** [August 31, 2021, 10:42am UTC](https://discourse.processing.org/t/getting-to-grips-with-vectorization-in-py5/32023/1 "2021-08-31T10:42:14Z")

</div>

@solub, @tabreturn @villares thanks for some kind help from @hx2A I’m making progress with numpy and image processing in py5. Recently there has been some discussion about the quality of different [noise implementations](https://discourse.processing.org/t/uniformly-distributed-perlin-noise/31768), this a sketch after an example by @hx2A that explores UniformNoise (java), vnoise (python) and OpenSimplex2 (java).

```python
import py5
import numpy as np
from PIL import Image
import noise
import vnoise

OpenSimplex2S = py5.JClass('monkstone.noise.OpenSimplex2S')
UniformNoise = py5.JClass('micycle.uniformnoise.UniformNoise')

w, h = 1200, 800

vector_noise = vnoise.Noise()
xgrid, ygrid = np.meshgrid(np.linspace(0, 12 // 3, num=w // 3, dtype=np.float32), np.linspace(0, 12, num=h, dtype=np.float32))
noise_array = np.full((h, w // 3, 3), 255, dtype=np.uint8)
noise_array2 = noise_array.copy()
noise_array3 = noise_array.copy()

def setup():
    py5.size(w, h)
    global open_simplex, uniform_noise
    open_simplex = OpenSimplex2S(py5.millis())
    uniform_noise = UniformNoise()

def draw():
    # UniformNoise by micycle
    noise_array[:, :, 0] = 255 * (np.vectorize(uniform_noise.uniformNoise)(xgrid, ygrid, py5.frame_count * 0.01, 4, 0.5))
    py5.image(Image.fromarray(noise_array, mode='HSV').convert('RGB'), 0, 0)
    # vnoise library
    noise_array2[:, :, 0] = 255 * (vector_noise.noise3(ygrid, xgrid, py5.frame_count * 0.1, octaves=1, grid_mode=False) + 1) / 2
    py5.image(Image.fromarray(noise_array2, mode='HSV').convert('RGB'), 400, 0)
    # open simplex
    noise_array3[:, :, 0] = 255 * (np.vectorize(open_simplex.noise3_Classic)(ygrid, xgrid, py5.frame_count * 0.1) + 1) / 2
    py5.image(Image.fromarray(noise_array3, mode='HSV').convert('RGB'), 800, 0)

py5.run_sketch()

```

Output:-

 ![vectorize](https://canada1.discourse-cdn.com/flex036/uploads/processingfoundation1/original/2X/d/d407bcf9d4b183b1a80377c0140a1c790332d632.png)

---

<div class="post-metadata">

**Author:** ![hx2A](https://yyz2.discourse-cdn.com/flex036/user_avatar/discourse.processing.org/hx2a/32/14322_2.png) [@hx2A](https://discourse.processing.org/u/hx2A)\
**Post date:** [August 31, 2021, 1:56pm UTC](https://discourse.processing.org/t/getting-to-grips-with-vectorization-in-py5/32023/2 "2021-08-31T13:56:00Z")

</div>

Excellent work! It is interesting to see the improvements in noise quality provided by algorithms like uniform noise.

---

<div class="post-metadata">

**Author:** ![micycle](https://yyz2.discourse-cdn.com/flex036/user_avatar/discourse.processing.org/micycle/32/201_2.png) [@micycle](https://discourse.processing.org/u/micycle)\
**Post date:** [August 31, 2021, 6:11pm UTC](https://discourse.processing.org/t/getting-to-grips-with-vectorization-in-py5/32023/3 "2021-08-31T18:11:49Z")

</div>

Note that your comparing 4-octave noise from UniformNoise vs 1 octave in the other two.

---

<div class="post-metadata">

**Author:** ![hx2A](https://yyz2.discourse-cdn.com/flex036/user_avatar/discourse.processing.org/hx2a/32/14322_2.png) [@hx2A](https://discourse.processing.org/u/hx2A)\
**Post date:** [September 1, 2021, 9:52pm UTC](https://discourse.processing.org/t/getting-to-grips-with-vectorization-in-py5/32023/4 "2021-09-01T21:52:05Z")

</div>

How do you specify the number of octaves using UniformNoise?

---

<div class="post-metadata">

**Author:** ![monkstone](https://yyz2.discourse-cdn.com/flex036/user_avatar/discourse.processing.org/monkstone/32/64_2.png) [@monkstone](https://discourse.processing.org/u/monkstone)\
**Post date:** [September 2, 2021, 8:14am UTC](https://discourse.processing.org/t/getting-to-grips-with-vectorization-in-py5/32023/5 "2021-09-02T08:14:01Z")

</div>

I knew that, I thought it was sort of optimum. It’s probably a bit confusing to have all the parameters in the noise function, given the possibility of 1d, 2d, 3d, 4d and possibly higher dimensions. As a rubyist anything more than say 4 parameters is frowned on. In this case you could have default values for octave, and persistence?
