分析python中的峰值

时间:2016-04-22 16:51:25

标签: python-3.x numpy pandas

我有这些数据集,包括接近完美间隔的峰。峰不是dirac delta函数,而是更高的高斯形状。我需要使用python非常精确地分析峰值之间的距离。 enter image description here

我是python的初学者所以我真的很感激一些帮助。 这些文件的类型为.csv.h5

(我发现.csv文件对于大样本来说太大了,所以我不得不切换到.h5。)

在我的分析中,到目前为止,我使用了pandas - 包和numpy - 包,我的猜测是他们也能够为我解决这个问题。

所以我有了这个想法,我可以过滤掉峰上的特定点。我试过这个:

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

#data = [time,voltage]
data1 = pd.read_csv('1pps_withoutReference.csv', sep=',')

#Plot data
time = data1["x"];
voltage = data1["y"];
plt.plot(time,voltage)
plt.show()

t = data1["x"];
v = data1["y"];

if n+1>4 and n-1<4: n=n;
else v.remove('n');
for n in v;

我想在最后一部分我想要做的事情的想法非常清楚,但它根本不起作用。 我只知道前面的点小于4并且之后的点在上面的点。这应该给我离散值,并且只会产生一个微小的偏移量,因为我正在寻找峰值之间的距离。

我在朋友的帮助下解决了这个问题。

#getting t values for every peak.
time = data1["x"]
volt = data1["y"]

trig_lev = 2.5
#Creating new vector to contain the values of the peaks
t_peak = []
#For-loop updating the list with the disired values
for i in np.arange(0, len(time)):
    if volt[i] < trig_lev and volt[i+1] >= trig_lev:
    t_peak.append(time[i])

1 个答案:

答案 0 :(得分:1)

让我为一个例子构建一个假的vt数组。

In [1]: import numpy as np

In [2]: v = np.random.random(20)*10

In [3]: t = np.arange(len(v))

现在,让我们在v中找到3到5之间的所有值。

In [4]: cond = np.logical_and(v < 5, v > 3)

In [5]: cond
Out[5]: 
array([False, False, False,  True, False, False, False, False, False,
       False, False, False, False, False,  True, False, False, False,
       False, False], dtype=bool)

这是有效的,因为对数字数组的<>操作会返回一个布尔值数组。

In [6]: v
Out[6]: 
array([ 2.82501842,  9.28107914,  8.48711041,  4.61051569,  1.77473463,
        7.69499025,  9.74680202,  1.37199899,  6.34510291,  2.33337724,
        2.22011283,  6.63674361,  9.20012545,  5.80648649,  4.43828229,
        1.4105842 ,  2.72444927,  2.09571288,  5.80758599,  1.73408051])

In [7]: v < 5
Out[7]: 
array([ True, False, False,  True,  True, False, False,  True, False,
        True,  True, False, False, False,  True,  True,  True,  True,
       False,  True], dtype=bool)

In [8]: v > 3
Out[8]: 
array([False,  True,  True,  True, False,  True,  True, False,  True,
       False, False,  True,  True,  True,  True, False, False, False,
        True, False], dtype=bool)

logical_and函数组合了两个布尔数组。

现在隔离满足此条件的t值。

In [9]: ix = [y for y, u in zip(t, cond) if u]

In [10]: ix
Out[10]: [3, 14]

检查v值。

In [11]: [v[i] for i in ix]
Out[11]: [4.611, 4.438]