当前位置: 首页 > news >正文

【Python】Numpy数值积分

文章目录

    • 求和
    • 累加和累乘
    • trapz

连乘连加元素连乘prod, nanprod;元素求和sum, nansum
累加累加cumsum, nancumsum;累乘cumprod, nancumprod

求和

在Numpy中可以非常方便地进行求和或者连乘操作,对于形如 x 0 , x 1 , ⋯   , x n x_0,x_1,\cdots,x_n x0,x1,,xn的数组而言,其求和 ∑ x i \sum x_i xi或者连乘 ∏ x i \prod x_i xi分别通过sumprod实现。

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中提供了nansumnanprod,可以将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()

效果如图所示

在这里插入图片描述

cumprood可以实现累乘操作,即

x = np.arange(1, 10)
print(np.cumprod(x))
# [     1      2      6     24    120    720   5040  40320 362880]

sum, prod相似,cumprodcumsum也提供了相应的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]之间的积分是 1 + 0 2 = 1 2 \frac{1+0}{2}=\frac{1}{2} 21+0=21,此即梯形积分

>>> np.trapz(x)
8.0

接下来对比一下trapzcumsum作用在 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()

结果如图,可见二者差别极小。
在这里插入图片描述

相关文章:

  • 【Spring】Bean的生命周期详解
  • 【虚拟仿真】Unity3D中实现InputField组件表格Tab或者Enter换行实现
  • 【微服务】ES使用实战·黑马旅游(五)
  • JavaScript(三)-全面详解(学习总结---从入门到深化)
  • Windows Server 2022 Install Sql Server 2022
  • Openharmony的用户态应用通过HDF框架驱动消息机制实现的通信实例
  • 程序员为什么要写技术博客?都在哪些平台呢?
  • OpenStack haproxy Statistics Report统计报告怎么在哪里,haproxy Dashboard怎么打开
  • python GUI(Tkinter)
  • 【自学Python】Python字符串首字母大写
  • Java文档搜索引擎
  • 《小猫猫大课堂》三轮4——自定义类型(位段,枚举,联合)(内含通讯录)
  • JMeter本地环境搭建
  • 测试开发之Django实战示例 第一章 创建博客应用
  • 传感器模组:手机摄像头模组-1亿像素是如何实现的?
  • epoll设计实现
  • Spring整合SpringMvc
  • 【内网安全-隧道搭建】内网穿透_Frp上线、测试
  • 【Linux】冯诺依曼体系与操作系统(OS)概念
  • CUDA的代替选择
  • 巴菲特再谈投资日本:希望持有日本五大商社至少50年
  • 2025年五一档电影票房破4亿,《水饺皇后》领跑
  • 缔造“水饺皇后”的香港,也是被移民塑造的香港
  • “三桶油”一季度净赚966亿元:业绩分化加剧,有人欢喜有人愁
  • 遍体鳞伤就是击不倒,这是国米老男孩最后的倔强
  • 五一期间全国高速日均流量6200万辆,同比增长8.1%