这里需要用的集合的知识,一般python集合会用intervals库portion库,这里我们用portion库

  • intervals库github:https://github.com/kvesteri/intervals
  • portion库github:https://github.com/AlexandreDecan/portion

需要安装:

pip install portion

算法思路

  1. 得到序列的极值,根据极值(极大值、极小值)划分区间,在一个区间里的数就是单调的,这样可以简化计算
  2. 一个区间一个区间的判断
  3. 有可能第一个区间插入目标区间一半,另一个区间没捅穿又出来了,类似于“W”类型,因此我们使用一个记录过往区间的变量cul_portion,记录之前走过的区间
import numpy as np
import portion
import scipy.signal as sgdef monotonic(x):"""判断单调"""dx = np.diff(x)return np.all(dx <= 0) or np.all(dx >= 0)def check_cross_interval(values: np.ndarray, target_interval: portion.Interval) -> int:"""看序列值横穿整个目标区间的次数:param values: 一个序列值:param target_interval: 目标区间:return: 次数"""if len(values) < 2:  # 值小于2return 0if monotonic(values):  # 单调value_portion = portion.closed(values.min(), values.max())if target_interval in value_portion:return 1else:return 0single_index = np.append(sg.argrelmin(values)[0], sg.argrelmax(values)[0])single_index.sort()# 第一个区间cross_num = 0  # 穿过的次数first_portion = portion.closed(min(values[0], values[single_index[0]]), max(values[0], values[single_index[0]]))if target_interval in first_portion:cross_num += 1# 中间所有的区间cul_portion = portion.empty()  # 用于不断迭代合并的区间last_index = single_index[0]for index in single_index[1:]:interval_portion = portion.closed(min(values[last_index], values[index]), max(values[last_index], values[index]))last_index = indexcul_portion = cul_portion.union(interval_portion)if target_interval in cul_portion:cross_num += 1cul_portion = portion.empty()# 最后一个区间last_index = portion.closed(min(values[-1], values[single_index[-1]]), max(values[-1], values[single_index[-1]]))if target_interval in last_index:cross_num += 1return cross_numif __name__ == '__main__':array = np.array([1, 2, 3, 2, -1, 2, 3, 0, 2, -1])across_counts = check_cross_interval(array, portion.closed(0, 1))print(across_counts)  # 5次

python判断序列值横穿整个区间的次数相关推荐

  1. python判断一个值是否为Nan,NULL

    python判断一个值是否为Nan,NULL 在实际的实验中,我们经常会遇到输出为Nan或者NULL的情况,那么我们该如何去判断它,然后用if语句将其规避勒 方案一如下: import numpy a ...

  2. python判断一个数是否在一个区间内_Python3基础 if elif 示例 判断一个数在哪个区间内...

    Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda : 4.5.11 typesetting : Markdown ...

  3. python判断序列符号变化的次数

    方法如下 def across_zero(series: pd.Series):"""统计越过0的次数"""return sum((seri ...

  4. python判断当前时间是否在两个时间之间_Python 判断时间是否在时间区间内的实例...

    判断时间是否在时间区间内 大家都知道 3<4<5这种连等式判断在python中是可行的 >>> 3<4<5 True 那么给定时间是否在时间区间内,也可以用连 ...

  5. python如何判断列表是否为空_python简单判断序列是否为空的方法

    python简单判断序列是否为空的方法 本文实例讲述了python简单判断序列是否为空的方法.分享给大家供大家参考.具体如下: 假设有如下序列: m1 = [] m2 = () m3 = {} 判断他 ...

  6. Python numpy 判断零矩阵,判断某个值(a)是否在矩阵中

    Python numpy 判断0 矩阵,判断某个值(a)是否在矩阵中 百度找 这个需求, 发现没有一种比较简单的解决方式:很多给的答案是要用 循环的方式解决,我觉得不好. 所以写了 一个简单的方式. ...

  7. Python设置属性值方法setattr()和判断变量是否存在的方法

    介绍Python设置属性值方法setattr()和判断变量是否存在的方法 1.以属性名为变量的方式给一个对象添加属性 使用 setattr 方法 obj = SomeClass() key = 'ke ...

  8. python 判断字典是否包含某个key,以及对应的value 值

    python 判断字典是否包含某个key 可以使用 in 来判断 具体如下: num = {"a": 1, "b": 2, "c": 3} ...

  9. python之判断一个值是不是可以被调用

    判断一个值是不是可以被调用---callable方法 要点,传值时只传入名字,后面不加括号 def func(arg):"""判断arg是否可以被调用,如果可以则执行,并 ...

最新文章

  1. 开发者必备!Github 上 1.6W 星的「黑魔法」,早知道就不会秃头了
  2. MDK_main()代码执行过程分析
  3. java中使用okhttpsoap,Android okHttp网络请求之Retrofit+Okhttp+RxJava组合
  4. LeetCode MySQL 580. 统计各专业学生人数
  5. RuoYi-Cloud 部署篇_03(linux环境 Oracle +nginx版本)
  6. 【教程】利用OBS+腾讯会议进行线上考试
  7. less-postcss
  8. 一生一世一双人,半醉半醒半浮生
  9. 什么是CloudComputing
  10. [ZJOI2006]物流运输
  11. C++ GUI Qt4 自学笔记
  12. 跟我一起学C++课程笔记(第二天)
  13. 【UVA10603】Fill(优先队列+状态转移)
  14. 免费分享20套PHP源码
  15. 一文详解 NanoHttpd 微型服务器原理
  16. word文档通配符换行_Word效率指南(二)
  17. excel冻结窗格线的设置问题
  18. Django在Terminal中python manage.py startapp myapp报name ‘os‘ is not defined
  19. gb 28181的20位编码简介
  20. 猜数字?我要王者荣耀

热门文章

  1. AD/DA的分类与指标
  2. 2019日历全年一张_看,日历里居然藏着一座艺术馆!让这本最美日历开启2021年好运...
  3. Epic高管:虚幻4引擎目标是不同规模开发商
  4. Netrunner 2019.04 Rolling 版本发布
  5. vue插槽--slot
  6. jqgrid 批量启动所有行为可编辑状态
  7. 《深入理解OSGi:Equinox原理、应用与最佳实践》一3.4 事件监听
  8. myeclipse查询mysql出来的汉字是乱码
  9. 阿里云、小米、华为手机竞争对比初评
  10. FireFox中国管理者的脑袋被驴踢了。