2017-05-25 4 views
1

1つの行に力の測定値が含まれ、他の行に他の測定値が含まれる2D配列があります。ゼロ交差を選択境界として使用して、サブ配列内のパーティション配列

スライスで構成されるサブアレイをフォーマット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] 

それは「ブロブ検出」と概念的に似ているが、1つの軸のみに沿って。

NumpyやScipyを使ってきれいにする方法がありません。

答えて

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] 

np.diff(mask)np.concatenateの代わりにmask[1:] != mask[:-1]を使用するには、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])] 
+0

非常にエレガントでnumpythonic、ありがとう! – heltonbiker

関連する問題