# [Edu-sig] a Mandelbrot Set in a few lines of Python

Kirby Urner kurner at oreillyschool.com
Fri Jun 19 19:12:27 CEST 2015

```I'm pleased how little code is required to make a decent Mandelbrot Set
image using Numpy + PIL, neither of which am I expert at using.  This is
how one learns. :-D

Here's how it looks on my screen:
https://flic.kr/p/uR81qU

For more about using fractals in teaching:

Fractals, Graphics, and Mathematics Education,
edited by Michael Frame and Benoit B. Mandelbrot
(c) 2002, Mathematical Association of America
ISBN: 0-88385-169-5

====

'''
Produces a decently high rez b/w graphic of Mandelbrot Set in
under a minute using default parameters.  Not super fast, but
conceptually useful both for the mathematics and for the demo
of numpy + PIL in an I-Python Notebook.

(cl) Kirby Urner, MIT License, 2015
Pilot study for O'Reilly School of Technology
Using I-Python Notebook + pillow (PIL fork) + in Anaconda distro
'''

from PIL import Image
import numpy as np

def setup(pixels=(3200,2400), offset=(-2.5, 1.2), inc=1/1000):
'''
Create patch of complex plane c for z = z**2 + c itereactions
pixels(columns, rows), offset(left, top), inc = step
'''
x, y = pixels
offx, offy = offset
field = np.zeros((x, y)).astype(np.complex)
for j in range(y):
for i in range(x):
field[i][j] = complex( offx + inc * i, offy - inc * j)
return field

def mandelbrot_set(c):
'''
Apply Mandelbrot transform (orbit of 0) to c
'''
z = np.zeros(c.shape).astype(np.complex) # starts 0s
for idx in range(100):
z = z * z + c
idx = abs(z) >= 2  # continue weeding out
z[idx] = 3+0j      # stamp out-of-bounds with 3

newf = (abs(z) < 2).astype(np.ubyte) # keep those in set
newf = newf * 255 # turn them white
im = Image.fromarray(newf)
im = im.rotate(90)
return im

m = setup()
image = mandelbrot_set(m) # may take 30 seconds or more!
image.save('mandelbrot.png', "png")
image.show()
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/edu-sig/attachments/20150619/a10f48a8/attachment.html>
```