Numpy数值积分如何实现
本篇内容主要讲解“Numpy数值积分如何实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Numpy数值积分如何实现”吧!
连乘连加 | 元素连乘prod, nanprod ;元素求和sum, nansum |
累加 | 累加cumsum, nancumsum ;累乘cumprod, nancumprod ; |
求和
在Numpy中可以非常方便地进行求和或者连乘操作,对于形如 x 0 , x 1 , ⋯   , xn的数组而言,其求和 ∑xi或者连乘 ∏xi分别通过sum
和prod
实现。
x = np.arange(10)print(np.sum(x)) # 返回45print(np.prod(x)) # 返回0
这两种方法均被内置到了数组方法中,
x += 1x.sum() # 返回55x.prod() # 返回3628800
有的时候数组中可能会出现坏数据,例如
x = np.arange(10)/np.arange(10)print(x)# [nan 1. 1. 1. 1. 1. 1. 1. 1. 1.]
其中x[0]
由于是0/0
,得到的结果是nan
,这种情况下如果直接用sum
或者prod
就会像下面这样
>>> x.sum()nan>>> x.prod()nan
为了避免这种尴尬的现象发生,numpy
中提供了nansum
和nanprod
,可以将nan
排除后再进行操作
>>> np.nansum(x)9.0>>> np.nanprod(x)1.0
累加和累乘
和连加连乘相比,累加累乘的使用频次往往更高,尤其是累加,相当于离散情况下的积分,意义非常重大。
from matplotlib.pyplot as pltxs = np.arange(100)/10ys = np.sin(xs)ys1 = np.cumsum(ys)/10plt.plot(xs, ys)plt.plot(xs, ys1)plt.show()
效果如图所示
cumprood
可以实现累乘操作,即
x = np.arange(1, 10)print(np.cumprod(x))# [ 1 2 6 24 120 720 5040 40320 362880]
与sum, prod
相似,cumprod
和cumsum
也提供了相应的nancumprod, nancumsum
函数,用以处理存在nan
的数组。
>>> 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]
这样的数组,那么稍微对高中知识有些印象,就应该知道[0,1]
之间的积分是,此即梯形积分
>>> np.trapz(x)8.0
接下来对比一下trapz
和cumsum
作用在 sin x \sin x sinx上的效果
from matplotlib.pyplot as pltxs = np.arange(100)/10ys = np.sin(xs)y1 = np.cumsum(ys)/10y2 = [np.trapz(ys[:i+1], dx=0.1) for i in range(100)]plt.plot(xs, y1)plt.plot(xs, y2)plt.show()
结果如图,可见二者差别极小。
到此,相信大家对“Numpy数值积分如何实现”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341