Numpy數(shù)值積分的實(shí)現(xiàn)
| 連乘連加 | 元素連乘prod, nanprod;元素求和sum, nansum |
| 累加 | 累加cumsum, nancumsum;累乘cumprod, nancumprod; |
求和
在Numpy中可以非常方便地進(jìn)行求和或者連乘操作,對于形如 x 0 , x 1 , ? , xn?的數(shù)組而言,其求和 ∑xi或者連乘 ∏xi分別通過sum和prod實(shí)現(xiàn)。
x = np.arange(10) print(np.sum(x)) # 返回45 print(np.prod(x)) # 返回0
這兩種方法均被內(nèi)置到了數(shù)組方法中,
x += 1 x.sum() # 返回55 x.prod() # 返回3628800
有的時候數(shù)組中可能會出現(xiàn)壞數(shù)據(jù),例如
x = np.arange(10)/np.arange(10) print(x) # [nan 1. 1. 1. 1. 1. 1. 1. 1. 1.]
其中x[0]由于是0/0,得到的結(jié)果是nan,這種情況下如果直接用sum或者prod就會像下面這樣
>>> x.sum() nan >>> x.prod() nan
為了避免這種尷尬的現(xiàn)象發(fā)生,numpy中提供了nansum和nanprod,可以將nan排除后再進(jìn)行操作
>>> np.nansum(x) 9.0 >>> np.nanprod(x) 1.0
累加和累乘
和連加連乘相比,累加累乘的使用頻次往往更高,尤其是累加,相當(dāng)于離散情況下的積分,意義非常重大。
from matplotlib.pyplot as plt xs = np.arange(100)/10 ys = np.sin(xs) ys1 = np.cumsum(ys)/10 plt.plot(xs, ys) plt.plot(xs, ys1) plt.show()
效果如圖所示

cumprood可以實(shí)現(xiàn)累乘操作,即
x = np.arange(1, 10) print(np.cumprod(x)) # [ 1 2 6 24 120 720 5040 40320 362880]
與sum, prod相似,cumprod和cumsum也提供了相應(yīng)的nancumprod, nancumsum函數(shù),用以處理存在nan的數(shù)組。
>>> x = np.arange(10)/np.arange(10) <stdin>:1: RuntimeWarning: invalid value encountered in true_divide >>> np.cumsum(x) array([nan, nan, nan, nan, nan, nan, nan, nan, nan, nan]) >>> np.nancumsum(x) array([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]) >>> np.nancumprod(x) array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
trapz
cumsum操作是比較容易理解的,可以理解為離散化的差分,比如
>>> x = np.arange(5) >>> y = np.cumsum(x) >>> print(x) array([0, 1, 2, 3, 4]) >>> print(y) array([ 0, 1, 3, 6, 10])
trap為梯形積分求解器,同樣對于[0,1,2,3,4]這樣的數(shù)組,那么稍微對高中知識有些印象,就應(yīng)該知道[0,1]之間的積分是
?,此即梯形積分
>>> np.trapz(x) 8.0
接下來對比一下trapz和cumsum作用在 sin ? x \sin x sinx上的效果
from matplotlib.pyplot as plt xs = np.arange(100)/10 ys = np.sin(xs) y1 = np.cumsum(ys)/10 y2 = [np.trapz(ys[:i+1], dx=0.1) for i in range(100)] plt.plot(xs, y1) plt.plot(xs, y2) plt.show()
結(jié)果如圖,可見二者差別極小。

到此這篇關(guān)于Numpy數(shù)值積分的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Numpy數(shù)值積分內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python+Matplotlib繪制發(fā)散條形圖的示例代碼
發(fā)散條形圖(Diverging Bar)是一種用于顯示數(shù)據(jù)分布的圖表,可以幫助我們比較不同類別或分組的數(shù)據(jù)的差異和相對性,本文介紹了Matplotlib繪制發(fā)散條形圖的函數(shù)源碼,需要的可以參考一下2023-06-06
Python with語句上下文管理器兩種實(shí)現(xiàn)方法分析
這篇文章主要介紹了Python with語句上下文管理器兩種實(shí)現(xiàn)方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Python上下文管理器的相關(guān)概念、功能、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2018-02-02
python根據(jù)給定文件返回文件名和擴(kuò)展名的方法
這篇文章主要介紹了python根據(jù)給定文件返回文件名和擴(kuò)展名的方法,實(shí)例分析了Python操作文件及字符串的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-03-03
Python?Pygame實(shí)戰(zhàn)之打磚塊游戲的實(shí)現(xiàn)
這篇文章主要介紹了如何利用Python實(shí)現(xiàn)經(jīng)典的游戲—打磚塊。玩家操作一根螢?zāi)簧纤降摹鞍糇印保屢活w不斷彈來彈去的“球”在撞擊作為過關(guān)目標(biāo)消去的“磚塊”的途中不會落到螢?zāi)坏紫?。感興趣的小伙伴可以了解一下2022-03-03

