使用零交叉作为选择边界的子数组中的分区数组



我有一个二维数组,其中一行包含力的测量值,另一行包含其他测量值。

我想要一种方法来获取由 subarray = full_array[:,start:end] 格式的切片组成的子数组,其中开始和结束是零交叉。

例如,忽略剩余的行,将提取具有第一行[-2, -1, 1, 2, 4, -1, -3, 2, 5, 8, 9, -3]的数组,如下所示:

extractions[0] = [1, 2, 4]
extractions[1] = [2, 5, 8, 9]

它在概念上类似于"斑点检测",但仅沿一个轴。

我想不出一种方法可以使用Numpy或Scipy干净地做到这一点。

一种方法 -

# Mask of greater than zeros
mask = np.r_[False, arr>0, False]
# Nonzero island start and stop indices
idx = np.flatnonzero(np.diff(mask)).reshape(-1,2)
# Split array based on start, stop indices
out = [arr[i:j] for i,j in idx]

为了提高性能,使用 mask[1:] != mask[:-1] 代替 np.diff(mask)np.concatenate可以替换np.r_

示例运行 -

In [332]: arr
Out[332]: array([-2, -1,  1,  2,  4, -1, -3,  2,  5,  8,  9, -3])
In [333]: out
Out[333]: [array([1, 2, 4]), array([2, 5, 8, 9])]

最新更新