python - 查找 NumPy 数组中的波动

标签 python numpy

是否有可能在列表中找到波动,使得图表达到某个峰值,它将开始在两个未知值之间波动。

我正在考虑关注所有高于阈值的数字

sum of numbers above thershold

我写了一些Python代码来模拟这个问题。图形首先增加到n值,然后它将在两个值mk之间波动。 enter image description here

背景:

该代码正在模拟时态网络上的分区 SIS 模型。也就是说,每个节点都位于其中一个隔室中(易感 - 感染 - 易感)。每个受感染节点尝试以 enter image description here 的概率感染相邻节点,从而进行感染传播。并以概率恢复 enter image description here在每个时间步。

如果低于阈值,感染就会消失enter image description here哪里enter image description here 。 那么代码的作用是,它在 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 的信号处理模块有 several methods为了找到那些。示例:

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 - 查找 NumPy 数组中的波动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50304296/

相关文章:

python pandas 通过列名列表从数据框中选择列

python - 具有 3 个电阻值的公差叠加组合

python - 在 numpy 中矢量化后的性能损失

python - 无法在 Mac 中从 Python 卸载 matplotlib、numpy 和 scipy。无法从 virtualenv 导入 matplotlib

python - 用于收集 numpy 数组的高效查找表

python - 用于文本分类算法的 word2Vec 向量表示

python - 无法打印字符串中存在的重复字符

python - 如何在Pygame中放入随机数

python - API 调用中出现 "ValueError: Single ' }' encountered in format string"问题

python - 使用 Parakeet 优化 Python 函数