如何用Python科學(xué)計(jì)算中的矩陣替代循環(huán)?
建議盡量使用 numpy 中的數(shù)組整體或者切片操作,以避免循環(huán),特別是多重循環(huán),以顯著地提高科學(xué)計(jì)算的效率。
舉幾個(gè)簡(jiǎn)單的例子如下:
假設(shè) A 是一個(gè)長(zhǎng)度為 n 的 numpy 數(shù)組:
1. 計(jì)算 A 中元素的和,使用 A.sum() 或者 np.sum(A),而不要使用循環(huán)求和。
2. 判斷 A 中是否有大于 1 的元素,使用 (A > 1).any(),不要循環(huán)進(jìn)行判斷。
3. 將 A 中大于 1 的元素取出放入一個(gè)新的數(shù)組,使用 A[A>1],不要循環(huán)判斷一個(gè)一個(gè)地取出元素。
4. 取出 A 中指標(biāo)為奇數(shù)的元素,使用 A[1::2],不要使用循環(huán)。
5. 將 A 中所有元素增大一倍,使用 A *= 2,不要循環(huán)遍歷每個(gè)元素乘 2 再賦值。
6. ......
Python 中做科學(xué)計(jì)算最常用最基礎(chǔ)的工具就是 numpy 了,有必要好好掌握。下面是 Python 做科學(xué)計(jì)算經(jīng)常會(huì)用到的一些模塊和軟件包:
numpy: Python 中最常用的數(shù)值計(jì)算庫(kù),提供了一個(gè)通用且功能強(qiáng)大的高維數(shù)組結(jié)構(gòu)及大量的科學(xué)計(jì)算函數(shù)(其中相當(dāng)一部分和 scipy 有交叉),是 Python 中幾乎所有其他科學(xué)計(jì)算庫(kù)的基礎(chǔ)。
scipy: 在 numpy 的基礎(chǔ)上提供了科學(xué)計(jì)算中各種常見(jiàn)問(wèn)題的解決工具,包括數(shù)學(xué)物理中的各種特殊函數(shù),數(shù)值積分,優(yōu)化,插值,傅立葉變換,線性代數(shù),信號(hào)處理,圖像處理,隨機(jī)數(shù)和概率分布,統(tǒng)計(jì)學(xué)等等。
sympy: Python 中的符號(hào)計(jì)算庫(kù),支持符號(hào)計(jì)算、高精度計(jì)算、模式匹配、繪圖、解方程、微積分、組合數(shù)學(xué)、離散數(shù)學(xué)、幾何學(xué)、概率與統(tǒng)計(jì)、物理學(xué)等方面的功能,能在很大程度上代替 Mathematica 和 Matlab 的符號(hào)計(jì)算功能。
Ipython: 一個(gè) Python 的交互式開(kāi)發(fā)和計(jì)算環(huán)境,比 Python 自帶的 shell 好用且功能強(qiáng)大得多,支持變量自動(dòng)補(bǔ)全,自動(dòng)縮進(jìn),支持 bash shell 命令,內(nèi)置了許多很有用的功能和函數(shù)。 IPython notebook 可以將代碼、圖像、注釋、公式和作圖集于一體,已經(jīng)成為用 Python 做教學(xué)、計(jì)算、科研的一個(gè)重要工具。
matplotlb: Python 做科學(xué)計(jì)算最常用和最重要的畫(huà)圖和數(shù)據(jù)可視化工具包。
h5py: 用 Python 操作 HDF5 格式數(shù)據(jù)的工具。HDF5 是一個(gè)應(yīng)用廣泛的科學(xué)數(shù)據(jù)存儲(chǔ)格式,擁有一系列的優(yōu)異特性,如支持非常多的數(shù)據(jù)類型,靈活,通用,跨平臺(tái),可擴(kuò)展,高效的 I/O 性能,支持幾乎無(wú)限量(高達(dá) EB)的單文件存儲(chǔ)等。
pandas: Python 中常用的數(shù)據(jù)分析包,適合時(shí)間序列及金融數(shù)據(jù)分析。
emcee: Python 實(shí)現(xiàn)的馬爾可夫鏈蒙特卡洛(MCMC)庫(kù)。
pymc: 另一個(gè)實(shí)現(xiàn)貝葉斯統(tǒng)計(jì)模型和馬爾科夫鏈蒙塔卡洛采樣的工具。
近些年 Python 在高性能計(jì)算領(lǐng)域的應(yīng)用也越來(lái)越廣泛,用 Python 做并行計(jì)算也是一個(gè)不錯(cuò)的選擇,既簡(jiǎn)單易用,又能在很多時(shí)候媲美 C、C++ 和 Fortran 的執(zhí)行性能。用 Python 做并行計(jì)算的途徑有很多,比如說(shuō)使用標(biāo)準(zhǔn)庫(kù)中的 [threading 模塊](https://docs.python.org/2/library/threading.html)進(jìn)行線程級(jí)別的并行,[multiprocessing 模塊](https://docs.python.org/2/library/multiprocessing.html)進(jìn)行進(jìn)程級(jí)別的并行,[concurrent.futures 模塊](https://docs.python.org/3/library/concurrent.futures.html)實(shí)現(xiàn)異步并行,使用 [IPython.parallel 模塊](https://ipython.org/ipython-doc/3/parallel/index.html)進(jìn)行多種方式的并行,使用 [mpi4py 包](https://pypi.org/project/mpi4py/)進(jìn)行 MPI 消息傳遞并行計(jì)算,等等。如果可以使用 C/C++,F(xiàn)ortran 或者使用 cython 為 Python 編寫(xiě)擴(kuò)展模塊,還可以使用 OpenMP 并行。對(duì) GPU 編程則可以使用 [pyCUDA](https://documen.tician.de/pycuda/)。我的個(gè)人[簡(jiǎn)書(shū)專題](https://www.jianshu.com/c/5019bb7bada6)和 [CSDN 博客專欄](https://blog.csdn.net/column/details/26248.html)中有對(duì)用 Python 做并行計(jì)算的專門介紹并提供了大量的程序?qū)嵗?。有需要或者感興趣的可以了解下。