在Ruby中替换字节类型NArray中的值

在Ruby中替换字节类型NArray中的值,ruby,narray,Ruby,Narray,我正在寻找一种方法,在字节数组中用1替换所有出现的'a',用2替换'T',用8替换'C',用16替换'G'。如何做到这一点?这就是您要寻找的吗 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 } 你注意到我没有改变ABC的基数,而是特别想给ATCG

我正在寻找一种方法,在字节数组中用1替换所有出现的'a',用2替换'T',用8替换'C',用16替换'G'。如何做到这一点?

这就是您要寻找的吗

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 }

你注意到我没有改变ABC的基数,而是特别想给ATCG分配新的值吗?好吧,我完全搞砸了-我想我明白了。。。我更改了答案请检查NArray->-我想在NArray级别执行此操作。否则我会认为tr会比你的建议快很多。我浏览了NArray API,但我不得不承认我并不擅长矩阵之类的东西。但正如你所说,可能有一个更好的解决方案,出于好奇,我想看看。祝你好运:)非常好。你认为这与tr:search='acgtumrwsynkvhdbn'相比有什么区别;替换=[1,2,4,8,2,5,9,3,12,6,10,13,7,11,14,15].pack(“C*”);string.tr!(搜索,替换)-测试代码()显示tr比NArray快。如果数据是以字符串形式提供的,则使用字符串#tr。如果是在数值处理环境中,则使用NArray。
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 ]