如何在Ruby Array中找到非空值的间隔?

时间:2011-10-19 18:45:22

标签: ruby narray

我感兴趣的是将NArray中的所有非空间隔定位为[begin,end]类型的元组。因此,如果我们有一个给定大小的NArray并且索引位置100 ... 200,300 ...... 400等处的所有值都不为零,我想获得这样的数组:[[100,200], [300,400], etc]。我不知道NArray界面中有什么东西 - 不幸的是记录不足 - 可以帮助我吗?速度至关重要。

干杯,

马丁

1 个答案:

答案 0 :(得分: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 ] ]