1

シーケンスの長いリスト間のペアごとの違いの数を計算し、それを行列形式に戻したいと思います。

私は数百の遺伝子配列を持っており、各配列はすでに整列されており、同じ長さ (約 300 文字) です。編集距離アルゴリズム (ハミング、レベインシュタインなど) の 1 つを探しているのではなく、2 つのシーケンス間の絶対差の数を取得したいと考えています。シーケンスは、各文字位置で比較する必要があります。

例えば、

Sequence 1: "GAT-ACA"
Sequence 2: "AT-GCGA"
Number of differences: 6

(ダッシュは、シーケンスを整列できるようにするためにあります。私のシーケンスにはダッシュも含まれる場合があります)。

短い計算時間で、python (または他の言語) を使用してこれを行う効率的な方法はありますか? 私もRでこの質問をしましたが、最初はそのようにするつもりでしたが、数百のシーケンスに適用するには遅すぎることが判明しました。

ありがとうございました!

4

3 に答える 3

4

ペア間の差を表示するマトリックスを計算する場合は、次のように実行できます。

import numpy as np

def get_difference(x,y):
    return sum(ele_x != ele_y for ele_x, ele_y in zip(x,y))

my_list = ['abcde','abcwe','zbfwe']
n = len(my_list)

my_array = np.zeros((n,n))
#
for i, ele_1 in enumerate(my_list):
    for j, ele_2 in enumerate(my_list):
        if j >= i:
            break # Since the matrix is symmetrical we don't need to
                  # calculate everything
        difference = get_difference(ele_1, ele_2)  
        my_array[i, j] = difference
        my_array[j, i] = difference

結果:

>>> my_array
array([[ 0.,  1.,  3.],
       [ 1.,  0.,  2.],
       [ 3.,  2.,  0.]])

結果の行列(OK配列)は、ペア間の違いを示しています。

于 2012-07-08T19:14:44.400 に答える
2

文字列をタプルに圧縮します。次に、sumを使用してブール値のTrue(つまり一致しないポイント)をカウントします。

s1 = "GAT-ACA"
s2 = "AT-GCGA"

print sum(a != b for (a,b) in zip(s1, s2))
于 2012-07-08T19:04:43.313 に答える
0

私がよく理解していれば、ただ:

diff = lambda seq1, seq2: sum(seq1[i]!=seq2[i] for i in range(len(seq1)))
于 2012-07-08T18:56:48.563 に答える