5

使用 NArray,是否有一些漂亮的方法可以创建值低于例如 5 的数组掩码,但仅适用于锚定左侧或右侧的值的运行,例如这个一维数组:

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

会导致:

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

这个二维数组:

[[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]]
4

1 回答 1

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 ] ]
于 2012-02-10T06:45:32.857 回答