2016-04-09 17 views
-1

Iは分割numpyのアレイによるBOOL

a = np.array[ 4, 9, 3, 1, 6, 4, 7, 4, 2]

boo = np.array[ True, True, False, False, True, True, True, False, True]

ように同じ大きさのブール配列(その結果、マスク'S)(booも開始することができるような配列を有します最初のエントリとしてFalse ...)

今すぐ分割したい2つの条件で新しいアレイに:

  • 新しいサブアレイは新しいサブアレイFalse後に常に始まり、False前に終了boo
  • True有する値のみを含んでいます。私は基本としてnp.splitを使用することができることを知って

    だから結果は[[4, 9], [6, 4, 7], [2]]

私の考えがあるだろう。
この場合、それはb = np.split(a, [2, 4, 7, 8]となるでしょう。その後、私は最初の要素がbooTrueであるため、最初の要素から始めて、bから2番目の要素を取ります。

私の問題は次のとおりです。[2, 4, 7, 8]を取得するにはどうすればよいですか?

(それはあまりにも遅いですので、pythonのでループすることは、オプションではありません。)

答えて

1

たぶん、これは十分に速い:

単純かつ迅速な方法が見つかり
d = np.nonzero(boo != np.roll(boo, 1))[0] 
if d[0] == 0: 
    d = d[1:] 
b = np.split(a, d) 
b = b[0::2] if boo[0] else b[1::2] 

indices = np.nonzero(boo[1:] != boo[:-1])[0] + 1 
b = np.split(a, indices) 
b = b[0::2] if boo[0] else b[1::2] 

スライスの比較は、np.roll()とif文の少なくとも2倍の速さです。
また、np.flatnonzero(...)np.nonzero(...)[0]よりも良く見えますが、やや遅くなります。

関連する問題