如何用python科学计算中的矩阵替代循环?

比如求一个平面稳态导热问题,控制方程就是拉普拉斯方程:

 \nabla^{2}=0 (我才发现原来有[插入公式]这个功能)按照最简单的毅种循环来写就是:

def laplace(u):
nx, ny = u.shape
for i in xrange(1,nx-1):
for j in xrange(1, ny-1):
u[i,j] = ((u[i+1, j] + u[i-1, j]) * dy2 + (u[i, j+1] + u[i, j-1]) * dx2) / (2*(dx2+dy2))

你们都不知道numexpr的么←_←比numpy还黑的科技→_→虽然能用的运算没多少吧但是对大矩阵的整体运算还是很快的←_←
最近正好在学numpy这个模块。题主可以看看这个教程,不是很全,但是科学计算方面还是有不少东西的:numpy-快速处理数据引用教程中的代码:

import time
import math
import numpy as np
x = [i * 0.001 for i in xrange(1000000)] # 初始化数组0.000~999.999
start = time.clock()
for i, t in enumerate(x): # 用循环计算正弦值
x[i] = math.sin(t)
print “math.sin:”, time.clock() – start
x = [i * 0.001 for i in xrange(1000000)]
x = np.array(x) # 初始化矩阵(这里是一维)
start = time.clock()
np.sin(x,x) # numpy的广播计算(代替循环)
print “numpy.sin:”, time.clock() – start
# 输出
# math.sin: 1.15426932753
# numpy.sin: 0.0882399858083

用numpy, cython, 或者 weavespeed up pythonscipy官网有关于如何提高python performance的教程performancepython用pyrex/cython或者weave基本上可以达到c++的速度。laplace的例子,500*500矩阵,100次循环。numpy和pandas.dataframe的矩阵运算可以广播,可以map。
第一个技巧是,用map和lambda表达式来生成你要的迭代参数,比如生成一个平方表:map(lambda x: x*x, xrange(100)),这是个黑科技,可以很快速的生成你需要的循环参数;第二个技巧是,熟练使用矩阵掩膜(mask)来简化循环,比如把矩阵a中小于100的值都置零:a[a

Posted in 未分类

发表评论