python中如何用for语句选矩阵运算_如何用 Python 科学计算中的矩阵替代循环?

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

(我才发现原来有[插入公式]这个功能)

按照最简单的毅种循环来写就是:

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, 或者 weave

Speed up Python

SciPy官网有关于如何提高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<100] = 0,比循环快很多;

第三个技巧是,多使用各种库,如numpy, scipy(signal库简直好顶赞),如果你做图像,opencv库是唯一的选择。

大致是这样,实际应用中更多的是前两个trick混合使用。

想要快,就内嵌C,Python是解释性语言,会比较慢。

有成熟的计算软件时用的C/C+++python的模式,核心算法和耗时最多的逻辑用C/C++,其他用python.

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值