python - 查找 NumPy 数组中的波动
问题描述
是否有可能在列表中找到波动,使得一个图达到某个峰值,它将开始在两个未知值之间波动。
我正在考虑关注所有高于阈值的数字
我写了一些python代码来模拟这个问题。该图首先增加到n
值,它将在两个值m
和之间波动k
。
背景:
该代码正在模拟时间网络上的分区 SIS 模型。也就是说,其中的每个节点都在其中一个隔间中(易感 - 感染 - 易感)。感染由每个受感染节点传播,尝试以概率感染相邻节点,并在每个时间步以概率恢复。
如果低于where的阈值,感染就会消失。所以代码的作用是,它在一个 while(True) 循环中运行,检查感染是否消失,如果感染的覆盖率高于 40%。在这两个 if 语句之间,感染进入稳定状态,即它高于阈值但低于 40% 的覆盖率,并且在无限时间内波动。我正在尝试找到一种方法来找到列表中的这些波动。
模拟这种情况的代码(图表):
import random
import numpy as np
import matplotlib.pyplot as plt
n = 10
m = 11
k = 17
a = np.arange(0, n, 1)
a = np.asarray(a)
for i in range(100):
a = np.append(a, random.randint(m, k))
plt.plot(a)
plt.show()
解决方案
溶液振荡的区域可以通过相对最大值和最小值的存在来检测。SciPy 的信号处理模块有几种方法可以找到它们。例子:
from scipy.signal import argrelmin, argrelmax
extrema = np.concatenate((argrelmin(a)[0], argrelmax(a)[0]))
print((extrema.min(), extrema.max()))
为您的模拟数据打印 (12, 108) 振荡的开始和结束。开始标志着从增长到振荡的转变,结束只是观察的结束。
这种简单的方法不适用于振荡叠加在增长/衰减模式上的情况,例如函数f(x) = x + 2*sin(x)
. 但是从您对数据的描述来看,这似乎已经足够了。
推荐阅读
- python-3.x - 为什么 PyPDF2 找不到从 CSV 文件中读取的所有单词?
- angular - 无法在Angular中将值从父级传递给子级
- javascript - Next 带有静态页面、SSR 页面和客户端渲染的 JS Seo
- create-react-app - 使用按钮 React 创建 Div
- groovy - 无法从其他文件和关闭中捕获自定义异常
- flutter - 什么是撕下/撕下/撕下?
- nsis - 如何使用 NSIS 制作静默安装程序
- sql - 使用涉及唯一字段的另一个表中的值插入表
- time-series - 高效地将大型时间序列数据集加载到 Graphite 中
- parsing - Pyparsing 对 Wikipedia 自定义预处理需要太长时间