1

私はPythonが初めてで、助けが必要でした。

私はACAACGGのような文字列を持っています

要素が特定の文字の数である 3 つのベクトルを作成したいと思います。

たとえば、「A」の場合、これは (1123333) を生成します。「C」の場合、これは (0111222) などを生成します。

カウントの結果を文字列またはベクトルに入れる方法がわかりません。これは、文字列内の文字の出現回数をカウントすることに似ていると思いますが、文字列を実行して各ポイントにカウント値を配置する方法がわかりません。

参考までに、Burrows-Wheeler 変換を実装して文字列検索に使用しようとしています。しかし、文字の出現ベクトルを作成する方法がわかりません。

def bwt(s):
  s = s + '$'
  return ''.join([x[-1] for x in
     sorted([s[i:] + s[:i] for i in range(len(s))])])

これにより変換が得られ、その発生ベクトルを作成しようとしています。最終的には、これを使用して DNA 文字列の繰り返しを検索したいと考えています。

どんな助けでも大歓迎です。

4

2 に答える 2

2

ベクトルをどの型にしたいのかわかりませんが、s の a を返す関数を次に示しlistますint

 In [1]: def countervector(s, char):
   ....:     c = 0
   ....:     v = []
   ....:     for x in s:
   ....:         if x == char:
   ....:             c += 1
   ....:         v.append(c)
   ....:     return v
   ....: 

 In [2]: countervector('ACAACGG', 'A')
 Out[2]: [1, 1, 2, 3, 3, 3, 3]

 In [3]: countervector('ACAACGG', 'C')
 Out[3]: [0, 1, 1, 1, 2, 2, 2]

また、これを行うためのはるかに短い方法を次に示しますが、長い文字列ではおそらく非効率的です。

def countervector(s, char):
    return [s[:i+1].count(char) for i, _ in enumerate(s)]

お役に立てば幸いです。

于 2012-04-09T10:44:46.173 に答える
0

ここで約束したように、私が書いた完成したスクリプトです。参考までに、私は Burrows-Wheeler 変換を使用して、DNA の文字列で繰り返し一致を実行しようとしています。基本的には、ある長さ M の DNA 鎖を取り、そのストリング内のすべての反復を見つけるという考えです。したがって、例として、奇妙な acaacg があり、サイズ 2 のすべての重複部分文字列を検索すると、カウント 1 と開始位置 0,3 が得られます。次に、string[0:2] と string[3:5] を入力して、それらが実際に一致し、結果が "ac" であることを確認します。

Burrows-Wheeler について知りたい人は、ウィキペディアで検索すると非常に役立つ結果が得られます。これは、スタンフォードからの別の情報源でもあり、それをよく説明しています。 http://www.stanford.edu/class/cs262/notes/lecture5.pdf

さて、ここで取り上げなかった問題がいくつかあります。まず、n^2 空間を使用して BW 変換を作成しています。また、サフィックス配列を作成し、並べ替えてから数字に置き換えているため、作成すると少しスペースが必要になる場合があります。ただし、最後には、occ 行列、最後の列、および単語自体のみを実際に格納しています。

4^7 より大きい文字列の RAM の問題にもかかわらず (40,000 の文字列サイズで動作するようになりましたが、それ以上ではありません...)、私はこれを月曜日の前のように見て成功と呼びます。 python は、私の名前とこんにちは世界を印刷することでした。

#  generate random string of DNA
def get_string(length):
    string=""
    for i in range(length):
        string += random.choice("ATGC")
    return string

#  Make the BW transform from the generated string  
def make_bwt(word):
    word = word + '$'
    return ''.join([x[-1] for x in
        sorted([word[i:] + word[:i] for i in range(len(word))])])
#  Make the occurrence matrix from the transform        
def make_occ(bwt):
    letters=set(bwt)
    occ={}
    for letter in letters:
        c=0
        occ[letter]=[]
        for i in range(len(bwt)):
            if bwt[i]==letter:
            c+=1
            occ[letter].append(c)
    return occ

#  Get the initial starting locations for the Pos(x) values 
def get_starts(word):
    list={}
    word=word+"$"
    for letter in set(word):
        list[letter]=len([i for i in word if i < letter])
    return list

#  Single range finder for the BWT.  This produces a first and last position for one read.  
def get_range(read,occ,pos):
    read=read[::-1]
    firstletter=read[0]
    newread=read[1:len(read)]
    readL=len(read)
    F0=pos[firstletter]
    L0=pos[firstletter]+occ[firstletter][-1]-1

    F1=F0
    L1=L0
    for letter in newread:
        F1=pos[letter]+occ[letter][F1-1]
        L1=pos[letter]+occ[letter][L1] -1
    return F1,L1

#  Iterate the single read finder over the entire string to search for duplicates   
def get_range_large(readlength,occ,pos,bwt):
    output=[]
    for i in range(0,len(bwt)-readlength):
        output.append(get_range(word[i:(i+readlength)],occ,pos))
    return output

#  Create suffix array to use later 
def get_suf_array(word):
    suffix_names=[word[i:] for i in range(len(word))]   
    suffix_position=range(0,len(word))                  
    output=zip(suffix_names,suffix_position)
    output.sort()
    output2=[]
    for i in range(len(output)):                        
        output2.append(output[i][1])
    return output2

#  Remove single hits that were a result of using the substrings to scan the large string   
def keep_dupes(bwtrange):
    mylist=[]
    for i in range(0,len(bwtrange)):
        if bwtrange[i][1]!=bwtrange[i][0]:
            mylist.append(tuple(bwtrange[i]))
    newset=set(mylist)
    newlist=list(newset)
    newlist.sort()
    return newlist

#  Count the duplicate entries
def count_dupes(hits):
    c=0
    for i in range(0,len(hits)):
        sum=hits[i][1]-hits[i][0]
        if sum > 0:
            c=c+sum
        else:
            c
    return c

#  Get the coordinates from BWT and use the suffix array to map them back to their original indices 
def get_coord(hits):
    mylist=[]
    for element in hits:
        mylist.append(sa[element[0]-1:element[1]])
    return mylist

#  Use the coordinates to get the actual strings that are duplicated
def get_dupstrings(coord,readlength):
    output=[]
    for element in coord:
        temp=[]
        for i in range(0,len(element)):         
            string=word[element[i]:(element[i]+readlength)]
            temp.append(string)
        output.append(temp) 
    return output

#  Merge the strings and the coordinates together for one big list. 
def together(dupstrings,coord):
    output=[]
    for i in range(0,len(coord)):
        merge=dupstrings[i]+coord[i]
        output.append(merge)
    return output

Now run the commands as follows
import random  #  This is needed to generate a random string
readlength=12 #  pick read length
word=get_string(4**7) # make random word
bwt=make_bwt(word) # make bwt transform from word
occ=make_occ(bwt)  #  make occurrence matrix  
pos=get_starts(word)  #  gets start positions of sorted first row       
bwtrange=get_range_large(readlength,occ,pos,bwt) #  Runs the get_range function over all substrings in a string.    
sa=get_suf_array(word)  #  This function builds a suffix array and numbers it.  
hits=keep_dupes(bwtrange)   #  Pulls out the number of entries in the bwt results that have more than one hit.
dupes=count_dupes(hits) #  counts hits
coord=get_coord(hits)  #  This part attempts to pull out the coordinates of the hits.  
dupstrings=get_dupstrings(coord,readlength)  #  pulls out all the duplicated strings
strings_coord=together(dupstrings,coord)    #  puts coordinates and strings in one file for ease of viewing.
print dupes
print strings_coord
于 2012-04-14T07:37:18.180 に答える