专栏名称: 大数据文摘
普及数据思维,传播数据文化
目录
相关文章推荐
数据派THU  ·  【ICLR2025】FREQPRIOR: ... ·  3 天前  
人工智能与大数据技术  ·  倍儿地道的山寨DeepSeek:「深度求索儿」 ·  昨天  
软件定义世界(SDX)  ·  清华大学:普通人如何抓住DeepSeek红利 ·  4 天前  
人工智能与大数据技术  ·  别再“误用”LLM!GitHub高级工程师亲 ... ·  4 天前  
玉树芝兰  ·  Perplexity 的 Deep ... ·  3 天前  
51好读  ›  专栏  ›  大数据文摘

如何用Python画各种著名数学图案 | 附图+代码

大数据文摘  · 公众号  · 大数据  · 2017-04-15 21:33

正文

大数据文摘作品,转载具体要求见文末

编译团队:Aileen,徐凌霄


用Python绘制著名的数学图片或动画,展示数学中的算法魅力。


本项⽬目将持续更更新,数学中有着太多有趣的事物可以⽤用代码去展示。  欢迎提出建议和参与建设!


后台回复 “数学” 查看完整代码集哦


Mandelbrot 集



代码:46 lines (34 sloc) 1.01 KB


'''

A fast Mandelbrot set wallpaper renderer



reddit discussion: https://www.reddit.com/r/math/comments/2abwyt/smooth_colour_mandelbrot/

'''

import numpy as np

from PIL import Image

from numba import jit





MAXITERS = 200

RADIUS = 100





@jit

def color ( z , i ):

v = np.log2(i + 1 - np.log2(np.log2( abs (z)))) / 5

if v < 1.0 :

return v ** 4 , v ** 2.5 , v

else :

v = max ( 0 , 2 - v)

return v, v ** 1.5 , v ** 3





@jit

def iterate ( c ):

z = 0 j

for i in range ( MAXITERS ):

if z.real * z.real + z.imag * z.imag > RADIUS :

return color(z, i)

z = z * z + c

return 0 , 0 , 0





def main ( xmin , xmax , ymin , ymax , width , height ):

x = np.linspace(xmin, xmax, width)

y = np.linspace(ymax, ymin, height)

z = x[ None , :] + y[:, None ] * 1 j

red, green, blue = np.asarray(np.frompyfunc(iterate, 1 , 3 )(z)).astype(np.float)

img = np.dstack((red, green, blue))

Image.fromarray(np.uint8(img * 255 )).save( ' mandelbrot.png ' )





if __name__ == ' __main__ ' :

main( - 2.1 , 0.8 , - 1.16 , 1.16 , 1200 , 960 )



多米诺洗牌算法


代码链接:https://github.com/neozhaoliang/pywonderland/tree/master/src/domino



正二十面体万花筒



代码:53 lines (40 sloc) 1.24 KB


'''

A kaleidoscope pattern with icosahedral symmetry.

'''

import numpy as np

from PIL import Image

from matplotlib.colors import hsv_to_rgb





def Klein ( z ):

''' Klein's j-function '''

return 1728 * (z * (z ** 10 + 11 * z ** 5 - 1 )) ** 5 / \

( - (z ** 20 + 1 ) + 228 * (z ** 15 - z ** 5 ) - 494 * z ** 10 ) ** 3





def RiemannSphere ( z ):

'''

map the complex plane to Riemann's sphere via stereographic projection

'''

t = 1 + z.real * z.real + z.imag * z.imag

return 2 * z.real / t, 2 * z.imag / t, 2 / t - 1





def Mobius ( z ):

'''

distort the result image by a mobius transformation

'''

return (z - 20 ) / ( 3 * z + 1 j )





def main ( imgsize ):

x = np.linspace( - 6 , 6 , imgsize)

y = np.linspace( 6 , - 6 , imgsize)

z = x[ None , :] + y[:, None ] * 1 j

z = RiemannSphere(Klein(Mobius(Klein(z))))



# define colors in hsv space

H = np.sin(z[ 0 ] * np.pi) ** 2

S = np.cos(z[ 1 ] * np.pi) ** 2

V = abs (np.sin(z[ 2 ] * np.pi) * np.cos(z[ 2 ] * np.pi)) ** 0.2

HSV = np.dstack((H, S, V))



# transform to rgb space

img = hsv_to_rgb( HSV )

Image.fromarray(np.uint8(img * 255 )).save( ' kaleidoscope.png ' )





if __name__ == ' __main__ ' :

import time

start = time.time()

main( imgsize = 800 )

end = time.time()

print ( ' runtime: { :3f } seconds ' .format(end - start))



Newton 迭代分形



代码:46 lines (35 sloc) 1.05 KB


import numpy as np

import matplotlib.pyplot as plt

from numba import jit





# define functions manually, do not use numpy's poly1d funciton!

@jit ( ' complex64(complex64) ' , nopython = True )

def f ( z ):

# z*z*z is faster than z**3

return z * z * z - 1





@jit ( ' complex64(complex64) ' , nopython = True )

def df ( z ):

return 3 * z * z





@jit ( ' float64(complex64) ' , nopython = True )

def iterate ( z ):

num = 0

while abs (f(z)) > 1e-4 :

w = z - f(z) / df(z)

num += np.exp( - 1 / abs (w - z))

z = w

return num





def render ( imgsize ):

x = np.linspace( - 1 , 1 , imgsize)

y = np.linspace( 1 , - 1 , imgsize)

z = x[ None , :] + y[:, None ] * 1 j

img = np.frompyfunc(iterate, 1 , 1 )(z).astype(np.float)

fig = plt.figure( figsize = (imgsize / 100.0 , imgsize / 100.0 ), dpi = 100 )

ax = fig.add_axes([ 0 , 0 , 1 , 1 ], aspect = 1 )

ax.axis( ' off ' )

ax.imshow(img, cmap = ' hot ' )

fig.savefig( ' newton.png ' )





if __name__ == ' __main__ ' :

import time

start = time.time()

render( imgsize = 400 )

end = time.time()

print ( ' runtime: { :03f } seconds ' .format(end - start))



李代数E8 的根系




代码链接:https://github.com/neozhaoliang/pywonderland/blob/master/src/misc/e8.py



模群的基本域



代码链接:

https://github.com/neozhaoliang/pywonderland/blob/master/src/misc/modulargroup.py



彭罗斯铺砌



代码链接:

https://github.com/neozhaoliang/pywonderland/blob/master/src/misc/penrose.py



Wilson 算法



代码链接:https://github.com/neozhaoliang/pywonderland/tree/master/src/wilson



反应扩散方程模拟



代码链接: https://github.com/neozhaoliang/pywonderland/tree/master/src/grayscott



120 胞腔



代码:69 lines (48 sloc)  2.18 KB


# pylint: disable=unused-import

# pylint: disable=undefined-variable



from itertools import combinations, product

import numpy as np

from vapory import *





class Penrose ( object ):



GRIDS = [np.exp( 2 j * np.pi * i / 5 ) for i in range ( 5 )]



def __init__ ( self , num_lines , shift , thin_color , fat_color , ** config ):

self .num_lines = num_lines

self .shift = shift

self .thin_color = thin_color

self .fat_color = fat_color

self .objs = self .compute_pov_objs( ** config)





def compute_pov_objs ( self , ** config ):

objects_pool = []



for rhombi, color in self .tile():

p1, p2, p3, p4 = rhombi

polygon =






请到「今天看啥」查看全文