查找NumPy数组中的波动

时间:2018-05-12 08:30:46

标签: python numpy

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

我正在考虑关注超过阈值的所有数字

sum of numbers above thershold

我已经编写了一些python代码来模拟这个问题。图表首先会增加到n值,并且会在两个值mk之间波动。 enter image description here

背景

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

如果感染低于阈值enter image description here enter image description here,感染将会消失。 那么代码的作用是,它运行一段时间(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()

1 个答案:

答案 0 :(得分:1)

溶液振荡的区域可以通过相对最大值和最小值的存在来检测。 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)。但是根据您对数据的描述似乎已经足够了。