5

NArrayを使用して、たとえば5未満の値を持つ配列のマスクを作成するための便利な方法がありますが、左側または右側に固定された値の実行に対してのみです。たとえば、この1次元配列:

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

結果は次のようになります。

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

そしてこの2次元配列:

[[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 に答える