我有一个二维数组,其中一行包含力的测量值,另一行包含其他测量值。
我想要一种方法来获取由 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])]