最近试了一下Pythonxy,集成了Numpy和Scipy包的Py,在功能方面基本上能和Matlab相媲美了。除了一些专有的功能,Py和matlab相差也就在速度上了,毕竟一个是编译型程序,一个是解释性语言,在速度方面有着本质上的区别。不过Py的Numpy包里的wave和f2py模块,能让Py有着C和Fortran的运算速度。
闲话少说,下边是生成蕨类植物叶子的一段程序,主要是生成分形图形。蕨类植物的局部自相似性较适合做分形图形,计算过程中像素点选择有些少,算出来的图片真实感并不强。源码来自于《Python科学计算》
Python |copy code |?
01 import numpy as np02 import matplotlib.pyplot as pl03 import time04 05 ep1=np.array([[0,0,0],[0,0.16,0]])06 p1=0.0107 08 ep2=np.array([[0.2,-0.26,0],[0.23,0.24,0.44]])09 p2=0.710 11 ep3=np.array([[-0.15,0.28,0],[0.26,0.24,0.44]])12 p3=0.0713 14 ep4=np.array([[0.85,0.04,0],[-0.04,0.85,1.6]])15 p4=0.8516 17 def ifs(p,eq,init,n):18 pos=np.ones(3,dtype=np.float)19 pos[:2]=init20 21 p=np.add.accumulate(p)22 rands=np.random.rand(n)23 select=np.ones(n,dtype=np.int)*(n-1)24 for i,x in enumerate(p[::-1]):25 select[rands<x]=len(p)-i-126 27 result=np.zeros((n,2),dtype=np.float)28 c=np.zeros(n,dtype=np.float)29 30 for i in xrange(n):31 eqidx=select[i]32 tmp=np.dot(eq[eqidx],pos)33 pos[:2]=tmp34 35 result[i]=tmp36 c[i]=eqidx37 38 return result[:,0],result[:,1],c39 40 start=time.clock()41 x,y,c=ifs([p1,p2,p3,p4],[ep1,ep2,ep3,ep4],[0,0],1000000)42 print time.clock()-start43 44 pl.figure(figsize=(6,6))45 pl.subplot(121)46 pl.scatter(x,y,s=1,c="g",marker="s",linewidth=0)47 pl.axis("equal")48 pl.axis("off")49 pl.subplot(122)50 pl.scatter(x,y,s=1,c=c,marker="s",linewidth=0)51 pl.axis("equal")52 pl.axis("off")53 pl.subplots_adjust(left=0,right=1,bottom=0,top=1,wspace=0,hspace=0)54 pl.gcf().patch.set_facecolor("white")55 pl.show()56
计算的结果:
0
管理员 hsyyf: 2012年12月13日 下午9:31 ∇地下1层