我有一个二维数组,其中一行包含力的测量值,其他行包含其他测量值。
我想要一种方法来获得由subarray = full_array[:,start:end]
格式的切片组成的子阵列,其中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]
它在概念上类似于" blob detection",但只是沿着一个轴。
我无法用Numpy或Scipy干净利落地做到这一点。
答案 0 :(得分:1)
一种方法 -
# 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])]