如何用 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.

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











LinuxターミナルでPythonバージョンを表示する際の許可の問題の解決策PythonターミナルでPythonバージョンを表示しようとするとき、Pythonを入力してください...

PythonのPandasライブラリを使用する場合、異なる構造を持つ2つのデータフレーム間で列全体をコピーする方法は一般的な問題です。 2つのデータがあるとします...

Python:Hourglassグラフィック図面と入力検証この記事では、Python NoviceがHourglass Graphic Drawingプログラムで遭遇する可変定義の問題を解決します。コード...

Pythonクロスプラットフォームデスクトップアプリケーション開発ライブラリの選択多くのPython開発者は、WindowsシステムとLinuxシステムの両方で実行できるデスクトップアプリケーションを開発したいと考えています...

多くの開発者はPypi(PythonPackageIndex)に依存しています...

データの変換と統計:大規模なデータセットの効率的な処理この記事では、製品情報を含むデータリストを別の含有しているものに変換する方法を詳細に紹介します...

白い領域を見つけるためにPythonで高解像度の画像を処理する方法は? 9000x7000ピクセルの高解像度画像の処理、2つの写真を正確に見つける方法...

Pythonを使用してFTPサーバーに接続する場合、指定されたディレクトリでファイルを取得してダウンロードする際に、特にFTPサーバーのテキストをダウンロードする際に問題が発生する可能性があります。
