Выбор значений ниже порога и привязка слева или справа с помощью Ruby NArray - PullRequest
5 голосов
/ 09 февраля 2012

Используя 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 Ответ

2 голосов
/ 10 февраля 2012
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 ] ]
...