Замена значений в байтовом типе NArray в Ruby - PullRequest
2 голосов
/ 05 января 2012

Я ищу способ заменить все вхождения «A» на 1, «T» на 2, «C» на 8 и «G» на 16 в байтовом массиве.Как это можно сделать?

Ответы [ 2 ]

1 голос
/ 06 января 2012
require "narray"

class NArray
  def cast(type)
    a = NArray.new(type,*self.shape)
    a[] = self
    a
  end
end

conv = NArray.int(256)
atcg = NArray.to_na('ATCG', NArray::BYTE).cast(NArray::LINT)
conv[atcg] = [1,2,8,16]

seq_str = 'ABCDAGDE'
seq_ary = NArray.to_na(seq_str, NArray::BYTE).cast(NArray::LINT)

p conv[seq_ary]
#=> NArray.int(8):
#   [ 1, 0, 8, 0, 1, 16, 0, 0 ]
0 голосов
/ 05 января 2012

Это то, что вы ищете?

h = {'A' => 1, 'T' => 2, 'C' => 8, 'G' => 16}
a = ['A', 'B', 'C', 'D', 'A', 'G', 'D', 'E']

result = a.map {|c| h.include?(c) ? h[c] : c }
...