搜索

查看: 3075|回复: 11

[Python] Numpy数值积分的实现

[复制链接]
发表于 2023-5-4 17:20:58 | 显示全部楼层 |阅读模式
Editor 2023-5-4 17:20:58 3075 11 看全部
目录
  • 求和
  • 累加和累乘
  • trapz
    连乘连加元素连乘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))    # 返回45
    print(np.prod(x))   # 返回0
    这两种方法均被内置到了数组方法中,
    x += 1
    x.sum()     # 返回55
    x.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 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()
    效果如图所示

    2023022309184324.png

    2023022309184324.png


    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)
    :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]之间的积分是

    202322392222860.png

    202322392222860.png

    ​,此即梯形积分
    >>> 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()
    结果如图,可见二者差别极小。

    2023022309184425.png

    2023022309184425.png


    到此这篇关于Numpy数值积分的实现的文章就介绍到这了,更多相关Numpy数值积分内容请搜索知鸟论坛以前的文章或继续浏览下面的相关文章希望大家以后多多支持知鸟论坛
  • 回复

    使用道具 举报

    发表于 2023-6-28 16:43:21 | 显示全部楼层
    掌舵的鱼1987 2023-6-28 16:43:21 看全部
    楼主太厉害了!楼主,I*老*虎*U!我觉得知鸟论坛真是个好地方!
    回复

    使用道具 举报

    发表于 2023-6-28 20:19:59 | 显示全部楼层
    462710480 2023-6-28 20:19:59 看全部
    我看不错噢 谢谢楼主!知鸟论坛越来越好!
    回复

    使用道具 举报

    发表于 2023-6-28 20:58:57 | 显示全部楼层
    戏做顿 2023-6-28 20:58:57 看全部
    这个帖子不回对不起自己!我想我是一天也不能离开知鸟论坛
    回复

    使用道具 举报

    发表于 2023-6-30 01:37:42 | 显示全部楼层
    风来时狂放 2023-6-30 01:37:42 看全部
    楼主,大恩不言谢了!知鸟论坛是最棒的!
    回复

    使用道具 举报

    发表于 2023-6-30 14:17:04 | 显示全部楼层
    知足常乐77 2023-6-30 14:17:04 看全部
    这个帖子不回对不起自己!我想我是一天也不能离开知鸟论坛
    回复

    使用道具 举报

    发表于 2023-6-30 17:40:17 | 显示全部楼层
    李志敏 2023-6-30 17:40:17 看全部
    这个帖子不回对不起自己!我想我是一天也不能离开知鸟论坛
    回复

    使用道具 举报

    发表于 2023-6-30 20:30:39 | 显示全部楼层
    老橡树1 2023-6-30 20:30:39 看全部
    楼主太厉害了!楼主,I*老*虎*U!我觉得知鸟论坛真是个好地方!
    回复

    使用道具 举报

    发表于 2023-7-3 06:41:50 | 显示全部楼层
    永远就三年疗 2023-7-3 06:41:50 看全部
    楼主,大恩不言谢了!知鸟论坛是最棒的!
    回复

    使用道具 举报

    发表于 2023-7-3 13:30:20 | 显示全部楼层
    惜颜705 2023-7-3 13:30:20 看全部
    其实我一直觉得楼主的品味不错!呵呵!知鸟论坛太棒了!
    回复

    使用道具 举报

    • 您可能感兴趣
    点击右侧快捷回复 【请勿灌水】
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则 返回列表

    RSS订阅| SiteMap| 小黑屋| 知鸟论坛
    联系邮箱E-mail:zniao@foxmail.com
    快速回复 返回顶部 返回列表