我有一个numpy.array
,其中保存了一些时间序列数据,其中data[:,0]
是时间,其他列是一些测量值。我还有一个list_of_peaks
,它列出了数据中有一些有趣的东西。
我的目标是为list_of_peaks
中的每个点计算某个度量,该度量基于data
中比其他任何峰都近的点,即我想对data
进行半划分在list_of_peaks
中的每个点之间。
我目前(非常慢)的算法是这样的:
def measure(d,t_m,t_p):
radius = d[(d[:,0] > t_m)* (d[:,0] < t_p)]
return np.max(radius) - np.min(radius)
list_of_measures = []
for i in range(len(list_of_peaks)):
if i == 0:
list_of_measures.append(measure(data,data[0,0],(list_of_peaks[i+1] - list_of_peaks[i])/2+list_of_peaks[i]))
elif i == len(list_of_peaks) - 1:
list_of_measures.append(measure(data,list_of_peaks[i] - (list_of_peaks[i]-list_of_peaks[i-1])/2,data[-1,0]))
else:
list_of_measures.append(measure(data,list_of_peaks[i] - (list_of_peaks[i]-list_of_peaks[i-1])/2,(list_of_peaks[i+1] - list_of_peaks[i])/2+list_of_peaks[i]))
我还没有找到任何可以满足我目的的内置numpy
函数,但是我很确定这可以做得更好,我只是想看看怎么做。
答案 0 :(得分:0)
您可以使用numpy.where()(np.where())
x = np.array([
[0.1, 0.4, 0.7],
[0.3, 0.5, 0.2],
[0.9, 0.1, 0.8],
])
y = x[np.where(x[:,1] == 0.5)]
y
[[0.3 0.5 0.2]]
# or with multiple condition
y = x[np.where((x[:, 1] > 0.1 ) & (x[:, 1] < 0.5))]
y
[[0.1 0.4 0.7]]
答案 1 :(得分:0)
正如Brenlla指出的那样,np.split
可以满足我的大部分需求,因此,找到索引的速度最快。幸运的是,还有一个内置的numpy
函数,该函数对于时间序列非常快,因为它是按定义排序的列表。最终的地图可能有一个更快的解决方案,但是该算法的慢点仍然是分割:
splitter = np.ediff1d(list_of_peaks)/2 + list_of_peaks[:-1]
splitter_ind = np.searchsorted(data[:,0],splitter,side='right')
split_data = np.split(data[:,1],splitter_ind)
measures = np.array(list(map(lambda x: np.max(x) - np.min(x),split_data)))