我有时间和电压的数据点,创建如下所示的曲线.

时间数据是

array([ 0.10810811, 0.75675676, 1.62162162, 2.59459459,

3.56756757, 4.21621622, 4.97297297, 4.97297297,

4.97297297, 4.97297297, 4.97297297, 4.97297297,

4.97297297, 4.97297297, 5.08108108, 5.18918919,

5.2972973 , 5.51351351, 5.72972973, 5.94594595,

6.27027027, 6.59459459, 7.13513514, 7.67567568,

8.32432432, 9.18918919, 10.05405405, 10.91891892,

11.78378378, 12.64864865, 13.51351351, 14.37837838,

15.35135135, 16.32432432, 17.08108108, 18.16216216,

19.02702703, 20. , 20. , 20. ,

20. , 20. , 20. , 20. ,

20.10810811, 20.21621622, 20.43243243, 20.64864865,

20.97297297, 21.40540541, 22.05405405, 22.91891892,

23.78378378, 24.86486486, 25.83783784, 26.7027027 ,

27.56756757, 28.54054054, 29.51351351, 30.48648649,

31.56756757, 32.64864865, 33.62162162, 34.59459459,

35.67567568, 36.64864865, 37.62162162, 38.59459459,

39.67567568, 40.75675676, 41.83783784, 42.81081081,

43.89189189, 44.97297297, 46.05405405, 47.02702703,

48.10810811, 49.18918919, 50.27027027, 51.35135135,

52.43243243, 53.51351351, 54.48648649, 55.56756757,

56.75675676, 57.72972973, 58.81081081, 59.89189189])

伏特数据是

array([ 4.11041056, 4.11041056, 4.11041056, 4.11041056, 4.11041056,

4.11041056, 4.11041056, 4.10454545, 4.09794721, 4.09208211,

4.08621701, 4.07961877, 4.07228739, 4.06568915, 4.05909091,

4.05175953, 4.04516129, 4.03782991, 4.03123167, 4.02463343,

4.01803519, 4.01217009, 4.00557185, 3.99970674, 3.99384164,

3.98797654, 3.98284457, 3.97771261, 3.97331378, 3.96891496,

3.96451613, 3.96085044, 3.95645161, 3.95205279, 3.9483871 ,

3.94398827, 3.94032258, 3.93665689, 3.94325513, 3.94985337,

3.95645161, 3.96378299, 3.97038123, 3.97624633, 3.98284457,

3.98944282, 3.99604106, 4.0026393 , 4.00923754, 4.01510264,

4.02096774, 4.02609971, 4.02903226, 4.03196481, 4.03416422,

4.0356305 , 4.03709677, 4.03856305, 4.03929619, 4.04002933,

4.04076246, 4.04222874, 4.04296188, 4.04296188, 4.04369501,

4.04442815, 4.04516129, 4.04516129, 4.04589443, 4.04589443,

4.04662757, 4.04662757, 4.0473607 , 4.0473607 , 4.04809384,

4.04809384, 4.04809384, 4.04882698, 4.04882698, 4.04882698,

4.04956012, 4.04956012, 4.04956012, 4.04956012, 4.05029326,

4.05029326, 4.05029326, 4.05029326])

我想确定标记为A,B,C,D和E的点的位置.点A是斜率从零到未定义的第一个位置. B点是线不再垂直的位置. C点是曲线的最小值. D点是曲线不再垂直的地方. E点是斜率再次接近零的位置.下面的Python代码确定了A点和C点的位置.

tdiff = np.diff(time)

vdiff = np.diff(volts)

# point A

idxA = np.where(vdiff < 0)[0][0]

timeA = time[idxA]

voltA = volts[idxA]

# point C

idxC = volts.idxmin()

timeC = time[idxC]

voltC = volts[idxC]

如何确定曲线B,D和E所代表的曲线上的其他位置?

解决方法:

您正在寻找标记斜率变为或从零或无穷大的任何位置的点.我们实际上并不需要在任何地方计算斜率:yn-yn-1 == 0和yn 1-yn!= 0,反之亦然,或x相同.

我们可以采用x的差异.如果两个连续元素中的一个为零,那么diff的diff将是该点处的diff或负diff.因此,我们只想找到并标记diff(x)== diff(diff(x))和diff(x)!= 0的所有点,并根据数组之间的大小差异进行适当调整.我们也想要y所有相同的点.

在numpy术语中,这可以写成如下

def masks(vec):

d = np.diff(vec)

dd = np.diff(d)

# Mask of locations where graph goes to vertical or horizontal, depending on vec

to_mask = ((d[:-1] != 0) & (d[:-1] == -dd))

# Mask of locations where graph comes from vertical or horizontal, depending on vec

from_mask = ((d[1:] != 0) & (d[1:] == dd))

return to_mask, from_mask

to_vert_mask, from_vert_mask = masks(time)

to_horiz_mask, from_horiz_mask = masks(volts)

请记住,掩码是根据二阶差异计算的,因此它们比输入短两个元素.掩码中的元素对应于输入数组中的元素,在前沿和后沿具有单元素边界(因此下面的索引为[1:-1]).您可以使用np.nonzero将蒙版转换为索引,或者您可以使用蒙版作为索引直接获取x值和y值:

def apply_mask(mask, x, y):

return x[1:-1][mask], y[1:-1][mask]

to_vert_t, to_vert_v = apply_mask(to_vert_mask, time, volts)

from_vert_t, from_vert_v = apply_mask(from_vert_mask, time, volts)

to_horiz_t, to_horiz_v = apply_mask(to_horiz_mask, time, volts)

from_horiz_t, from_horiz_v = apply_mask(from_horiz_mask, time, volts)

plt.plot(time, volts, 'b-')

plt.plot(to_vert_t, to_vert_v, 'r^', label='Plot goes vertical')

plt.plot(from_vert_t, from_vert_v, 'kv', label='Plot stops being vertical')

plt.plot(to_horiz_t, to_horiz_v, 'r>', label='Plot goes horizontal')

plt.plot(from_horiz_t, from_horiz_v, 'k

plt.legend()

plt.show()

这是结果图:

请注意,由于分类是单独进行的,因此“点A”被正确识别为垂直度开始和水平度结束的点.问题是根据这些标准,“E点”似乎不可解析.放大显示所有增殖点正确识别水平线段:

您可以通过完全丢弃from_horiz来选择“Point E”的“正确”版本,并且只选择to_horiz中的最后一个值:

to_horiz_t, to_horiz_v = apply_mask(to_horiz_mask, time, volts)

to_horiz_t, to_horiz_v = to_horiz_t[-1], to_horiz_v[-1]

plt.plot(time, volts, 'b-')

plt.plot(*apply_mask(to_vert_mask, time, volts), 'r^', label='Plot goes vertical')

plt.plot(*apply_mask(from_vert_mask, time, volts), 'kv', label='Plot stops being vertical')

plt.plot(to_horiz_t, to_horiz_v, 'r>', label='Plot goes horizontal')

plt.legend()

plt.show()

我使用它作为apply_mask结果的星形扩展的展示.结果图是:

这几乎就是你要找的情节.丢弃from_horiz也会使“点A”仅被识别为垂直下降,这很好.

由于to_horiz中的多个值显示,此方法对数据中的噪声非常敏感.您的数据非常顺利,但这种方法不太适用于未经过滤的原始测量.

标签:python,pandas,numpy,scipy

python求斜率_python – 在曲线上找到斜率变化的位置相关推荐

  1. Matlab计算微分方程曲线求导及过曲线上点的切线方程

    Matlab计算微分方程曲线求导及过曲线上点的切线方程 求解f(x)=x^2一元二次方程上某点的切线方程并绘制出方程的切线图.点(4,f(4))是曲线方程f(x)上的一个点,求出该点的切线并绘制出来. ...

  2. 服务器支持ashx,如何在服务器上找到.ashx文件的位置

    背景:我的非编程职位的employeer知道我是一名本科CS学生,在网络开发方面有一定的经验.他已经切断了与他之前聘请的Web开发人员之间的关系,他经历了一次不愉快的经历,他支付我对网站进行了一些更改 ...

  3. python求乘积_Python实现求笛卡尔乘积的方法

    Python实现求笛卡尔乘积的方法 本文实例讲述了Python实现求笛卡尔乘积的方法.分享给大家供大家参考,具体如下: 在数学中,两个集合X和Y的笛卡尓乘积(Cartesian product),又称 ...

  4. python求众数_python求众数问题实例

    本文实例讲述了python求众数问题的方法,是一个比较典型的应用.分享给大家供大家参考.具体如下: 问题描述: 多重集中重数最大的元素称为众数...就是一个可以有重复元素的集合,在这个集合中重复的次数 ...

  5. python求积分_python 求定积分和不定积分示例

    求f(x) = sin(x)/x 的不定积分和负无穷到正无穷的定积分 sin(x)/x 的不定积分是信号函数sig ,负无穷到正无穷的定积分为pi import math import numpy a ...

  6. python求圆面积_python如何求圆的面积

    首先我们要知道圆的面积计算公式:S = πr²,公式中S为所求圆的面积,π为圆周率,r为圆的半径. 示例: # 定义一个方法来计算圆的面积 def findArea(r): PI = 3.142 re ...

  7. python求圆面积_python如何求圆的面积 python求圆的面积方法

    python如何求圆的面积?本篇文章小编给大家分享一下python求圆的面积方法,代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 首先我们要知道圆的面积计算 ...

  8. python求乘积_Python实现求笛卡尔乘积方法详解

    这篇文章主要介绍了Python实现求笛卡尔乘积的方法,结合实例形式分析了Python计算笛卡尔乘积的原理与实现技巧,需要的朋友可以参考下 本文实例讲述了Python实现求笛卡尔乘积的方法.分享给大家供 ...

  9. 用python求兀_python求π

    <像计算机科学家一样思考Python(第2版)>--2.5 操作顺序 本节书摘来自异步社区<像计算机科学家一样思考Python(第2版)>一书中的第2章,第2.5节,作者[美] ...

  10. python求数值积分_Python大数据处理-Scipy基础入门,数值积分计算

    温馨提示:阅读本文只需要1分钟,您就可以掌握Scipy进行定积分计算.二重.三重积分.多重积分的计算.继续承接上文学习Scipy科学数据处理,为我们后面Python大数据处理开发打基础.今天主要学习分 ...

最新文章

  1. Linux下修改Mysql的用户(root)的密码
  2. Windows下配置Java开发环境
  3. windows上安装Anaconda和python
  4. 8天学通MongoDB——第四天 索引操作
  5. 《系统集成项目管理工程师》必背100个知识点-12项目整体管理的过程
  6. win7查看 本地计算机策略,win7系统本地组策略编辑器打不开怎么办
  7. UnityShader15:前向渲染
  8. Layer动态设置每一行的背景色
  9. 解决联想小新笔记本电脑触摸板失灵
  10. mysql 汉字笔画排序规则_SQL Server与MySQL中排序规则与字符集相关知识的一点总结...
  11. windows 系统arp命令
  12. Linux——Vim编辑器三种模式(命令模式、输入模式、末行模式)的基本使用总结
  13. 数据防泄密-新时代公司发展的必须
  14. 跳跃游戏(Java)
  15. STM32应用开发实践教程:智能小车电机测速模块的应用开发
  16. 自己写一个composers包【一】
  17. 计算机视觉小白入门第一问——什么是计算机视觉
  18. FPGA解析串口协议帧3.0版本,增加了错误重发功能,提供仿真文件以及源码
  19. Kindle PaperWhite 3
  20. 三个课堂 专递课堂 名师课堂 名校网络课堂 校园电视台 虚拟演播室系统

热门文章

  1. 在ubuntu中添加widows启动项的简单方法
  2. 岳不群认识独孤九剑吗?
  3. 白泽六足机器人_ros_v1——零件准备
  4. 汉诺塔问题模拟实现代码
  5. C语言每日一练——第12天:求一个矩阵的转置
  6. 《IDSSIM:基于改进的疾病语义相似度方法的lncRNA功能相似度计算模型》论文梳理
  7. win10笔记本网络重置后没有网络连接了
  8. jquery php 分页插件,JQ分页插件
  9. Unity开发弱数据多人联网游戏(一)
  10. html5 视频缩略图,应用canvas获取video的缩略图