选择低于阈值的值并使用Ruby NArray锚定在左侧或右侧

时间:2012-02-09 15:42:21

标签: ruby narray

使用NArray,是否有一些很好的方法可以创建值低于例如数值的数组掩码5,但仅用于锚定左侧或右侧的值的运行,例如。这个1-D阵列:

[3, 4, 5, 7, 1, 7, 8]

会导致:

[1, 1, 0, 0, 0, 0, 0]

这个2-D阵列:

[[2, 4, 5, 7, 1, 2, 3], 
 [3, 4, 5, 7, 1, 7, 8],
 [8, 1, 1, 7, 1, 7, 1]]

会导致:

[[1, 1, 0, 0, 1, 1, 1], 
 [1, 1, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 1]]

1 个答案:

答案 0 :(得分:2)

require "narray"

def anchor_mask(mask)
  idx = (mask.not).where
  y = idx/mask.shape[0]
  u = (y[0..-2].ne y[1..-1]).where
  t = [0] + (u+1).to_a + [idx.size]
  s = (0..u.size).map{|i| idx[t[i]]..idx[t[i+1]-1]}
  mask[s] = 0
  return mask
end

a = NArray[3, 4, 5, 7, 1, 7, 8]

p anchor_mask a.lt(5)
#=> NArray.byte(7):
#   [ 1, 1, 0, 0, 0, 0, 0 ]

a = NArray[[2, 4, 5, 7, 1, 2, 3],
           [3, 4, 5, 7, 1, 7, 8],
           [8, 1, 1, 7, 1, 7, 1]]

p anchor_mask a.lt(5)
#=> NArray.byte(7,3):
#   [ [ 1, 1, 0, 0, 1, 1, 1 ],
#     [ 1, 1, 0, 0, 0, 0, 0 ],
#     [ 0, 0, 0, 0, 0, 0, 1 ] ]