如何根据数字列表将numpy数组拆分为子数组?

时间:2018-08-07 17:01:52

标签: python numpy

我有一个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函数,但是我很确定这可以做得更好,我只是想看看怎么做。

2 个答案:

答案 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)))
相关问题