How could I zoom in on a generated Mandelbrot set without consuming too many resources?

How could I zoom in on a generated Mandelbrot set without consuming too many resources?
python
Ethan Jackson

I am trying to make a Mandelbrot set display, with the following code:

import numpy as np import matplotlib.pyplot as plt plt.rcParams['toolbar'] = 'None' def mandelbrot(c, max_iter): z = 0 for n in range(max_iter): if abs(z) > 2: return n z = z*z + c return max_iter def mandelbrot_set(xmin, xmax, ymin, ymax, width, height, max_iter): r1 = np.linspace(xmin, xmax, width) r2 = np.linspace(ymin, ymax, height) n3 = np.empty((width, height)) for i in range(width): for j in range(height): n3[i, j] = mandelbrot(r1[i] + 1j*r2[j], max_iter) return n3.T # Settings xmin, xmax, ymin, ymax = -2.0, 1.0, -1.5, 1.5 width, height = 800, 800 max_iter = 256 # Generate Mandelbrot set mandelbrot_image = mandelbrot_set(xmin, xmax, ymin, ymax, width, height, max_iter) # Window fig = plt.figure(figsize=(5, 5)) fig.canvas.manager.set_window_title('Mandelbrot Set') ax = fig.add_axes([0, 0, 1, 1]) # Fill the whole window ax.set_axis_off() # Show fractal ax.imshow(mandelbrot_image, extent=(xmin, xmax, ymin, ymax), cmap='hot') plt.show()

How could I zoom in on the fractal continuously, without taking up too many resources? I am running on a mid-range laptop, and it currently takes a long time to generate the fractal. Is there a faster way to do this when implementing a zoom feature?

Answer

Looks like you made it as slow as you possibly could, using Python code to handle single NumPy numbers. That's the worst way. Would already be about twice as fast if you used Python numbers instead, using .tolist():

r1 = np.linspace(xmin, xmax, width).tolist() r2 = np.linspace(ymin, ymax, height).tolist()

But it would probably be better if you properly used NumPy, e.g., work on all pixels in parallel, keeping track of the indices that still have abs ≤ 2.

Related Articles