我有这些数据集,包括接近完美间隔的峰。峰不是dirac delta函数,而是更高的高斯形状。我需要使用python非常精确地分析峰值之间的距离。
我是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])
答案 0 :(得分:1)
让我为一个例子构建一个假的v
和t
数组。
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]