2011-10-19 9 views
1

私は[開始、終了]タイプのタプルとしてNArray内のすべての空でない間隔を探すことに興味があります。したがって、指定されたサイズのNArrayを持ち、インデックス位置100〜200,300 ... 400などのすべての値がゼロでない場合は、[[100,200], [300,400], etc]のような配列を取得したいと考えています。 NArrayインターフェースには何かがあります - 不幸にも文書化されていません - それは私を助けることができますか?スピードは非常に重要です。RubyのNArrayで空でない値の間隔を見つける方法は?

乾杯、

マーティン

NArrayのバージョンを使用している
+0

? – Ryanmt

+0

narray(0.5.9.9) ruby​​ 1.9.2p180(2011-02-18 revision 30909)[x86_64-darwin10.7.0] – maasha

答えて

1
$ irb -rnarray 
irb> a = NArray[0,1,2,0,0,5,0,7,8,9] 
irb> tmp = NArray.new(a.typecode, a.size+2) 
irb> tmp[1..-2] = a 
irb> tmp 
=> NArray.int(12): 
[ 0, 0, 1, 2, 0, 0, 5, 0, 7, 8, 9, 0 ] 

irb> empty = tmp.eq(0) 
=> NArray.byte(12): 
[ 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1 ] 

irb> beg = (~empty[1..-1] & empty[0..-2]).where 
=> NArray.int(3): 
[ 1, 5, 7 ] 

irb> fin = (empty[1..-1] & ~empty[0..-2]).where 
=> NArray.int(3): 
[ 3, 6, 10 ] 

irb> range = NArray[beg,fin].transpose(1,0) 
=> NArray.int(2,3): 
[ [ 1, 3 ], 
    [ 5, 6 ], 
    [ 7, 10 ] ] 
+0

優秀!これは今のところできます。インターバルを扱うための組み込み関数と、これらの関数の交点が順番に並ぶでしょうか? – maasha

関連する問題