Управление и подстроку нескольких строк в матрице (Python & Numpy) - PullRequest
1 голос
/ 07 марта 2020

У меня есть файл с именем «test.fa», который гласит:

>Sequence 1
TCAGAACCAGTTATAAATTTATCATTTCCTTCTCCACTCCT
>Sequence 2
CCCACGCAGCCGCCCTCCTCCCCGGTCACTGACTGGTCCTG
>Sequence 3
TCGACCCTCTGGAACCTATCAGGGACCACAGTCAGCCAGGCAAG
>Sequence 4
AAAACACTTGAGGGAGCAGATAACTGGGCCAACCATGACTC

Этот тестовый файл имеет только 8 строк, но может иметь больше. Я также не знаю длину всех последовательностей. Поэтому сначала я считаю количество строк и создаю матрицу на основе количества строк.

import numpy as np
filename = "test.fa"
with open(filename, 'r') as file:
    n1 = 0
    n2 = 0
    for line in file.readlines():
        if line[0] != '>':
            m1 = 1
            n1 = n1 + m1
        else:
            m2 = 1
            n2 = n2 + m2
    seq = np.chararray((n1,2),itemsize = 99)

Затем я добавляю значения в матрицу.

with open(filename, 'r') as file:
    n3 = -1
    n4 = -1
    for line in file.readlines():
        if line[0] != '>':
            m3 = 1
            n3 = n3 + m3
            seq[n3,1] = line
        else:
            m4 = 1
            n4 = n4 + m4
            seq[n4,0] = line

Если я позвоню 'seq' Я получаю:

chararray([[b'>Sequence 1', b'TCAGAACCAGTTATAAATTTATCATTTCCTTCTCCACTCCT'],
       [b'>Sequence 2', b'CCCACGCAGCCGCCCTCCTCCCCGGTCACTGACTGGTCCTG'],
       [b'>Sequence 3', b'TCGACCCTCTGGAACCTATCAGGGACCACAGTCAGCCAGGCAAG'],
       [b'>Sequence 4', b'AAAACACTTGAGGGAGCAGATAACTGGGCCAACCATGACTC']], dtype='|S99')

seq[2,1]: b'TCGACCCTCTGGAACCTATCAGGGACCACAGTCAGCCAGGCAAG'
seq[2,1][0] : 84
seq[2,1][0:8] : b'TCGACCCT'
seq[2,8][8] : 67
seq[2,1][8:9] : C

Это не самый лучший способ управлять этими данными (и почему [2,1] [0] возвращает 84?). Я не уверен, что np.chararray с itemize of 99 - лучший подход.

Мой вопрос: как лучше организовать / управлять этими данными? В конце концов мне нужно подсчитать вхождения каждого нуклеотида (т.е. сколько As, Ts, Cs, Gs) и вытащить подстроки из каждой последовательности. Для контекста это относится к максимизации ожиданий и выборке Гиббса.

Ответы [ 3 ]

1 голос
/ 07 марта 2020

возвращает 84, в то время как тип S99, потому что максимальная найденная длина была 99, поэтому типом будет S99, то, как вы читаете из файла, не так, и лучший способ управлять вашими данными - использовать dict, Я не знаю, будет ли это соответствовать вашим следующим потребностям, но вот оно:

seq={}
with open("file") as f:
    for line in f:
        seq[line]=next(f)

здесь будет считываться две строки за раз, поэтому первая line имеет последовательность 1, затем (f ) имеет последовательность TG C ....., если произошло, что файл не является последовательно упорядоченным, используйте оператор if

1 голос
/ 07 марта 2020

Используя np.chararray, вы получаете массив с S dtype, bytestrings:

In [145]: x = np.chararray((1,),10)                                                            
In [146]: x[0]='ACT'                                                                           
In [147]: x                                                                                    
Out[147]: chararray([b'ACT'], dtype='|S10')
In [148]: x[0]                                                                                 
Out[148]: b'ACT'
In [149]: x[0][0]                                                                              
Out[149]: 65
In [150]: x[0][1]                                                                              
Out[150]: 67
In [151]: x[0][2]                                                                              
Out[151]: 84

Это один байт на символ. Код ASCII A составляет 65; T на 19 символов дальше.

Вы видели примечание chararray:

Класс chararray существует для обратной совместимости с Numarray, он не рекомендуется для новых разработок. Начиная с numpy 1.4, если нужны массивы строк, рекомендуется использовать массивы dtype object_, string_ или unicode_ и использовать бесплатные функции в модуле numpy.char для быстрой векторизации строковые операции.

In [159]: x = np.array([b'ACT'])                                                               
In [160]: x                                                                                    
Out[160]: array([b'ACT'], dtype='|S3')
In [161]: x[0]                                                                                 
Out[161]: b'ACT'
In [162]: x[0][0]                                                                              
Out[162]: 65

Если вместо этого мы используем тип строки Py3 по умолчанию (Unicode):

In [154]: x = np.array(['ACT'])                                                                
In [155]: x                                                                                    
Out[155]: array(['ACT'], dtype='<U3')
In [156]: x[0]                                                                                 
Out[156]: 'ACT'
In [157]: x[0][0]                                                                              
Out[157]: 'A'
In [158]: x[0][1]                                                                              
Out[158]: 'C'

===

Я думаю, что сбор значений в списке или словаре было бы проще:

In [165]: txt = """>Sequence 1 
     ...: TCAGAACCAGTTATAAATTTATCATTTCCTTCTCCACTCCT 
     ...: >Sequence 2 
     ...: CCCACGCAGCCGCCCTCCTCCCCGGTCACTGACTGGTCCTG 
     ...: >Sequence 3 
     ...: TCGACCCTCTGGAACCTATCAGGGACCACAGTCAGCCAGGCAAG 
     ...: >Sequence 4 
     ...: AAAACACTTGAGGGAGCAGATAACTGGGCCAACCATGACTC"""                                         
In [166]: alist = []                                                                           
In [167]: for row in txt.splitlines(): 
     ...:     if row.startswith('>'): 
     ...:         x = [row] 
     ...:     else: 
     ...:         x.append(row) 
     ...:         alist.append(x) 
     ...:                                                                                      
In [168]: alist                                                                                
Out[168]: 
[['>Sequence 1', 'TCAGAACCAGTTATAAATTTATCATTTCCTTCTCCACTCCT'],
 ['>Sequence 2', 'CCCACGCAGCCGCCCTCCTCCCCGGTCACTGACTGGTCCTG'],
 ['>Sequence 3', 'TCGACCCTCTGGAACCTATCAGGGACCACAGTCAGCCAGGCAAG'],
 ['>Sequence 4', 'AAAACACTTGAGGGAGCAGATAACTGGGCCAACCATGACTC']]
In [169]: dd = {key:val for key,val in alist}                                                  
In [170]: dd                                                                                   
Out[170]: 
{'>Sequence 1': 'TCAGAACCAGTTATAAATTTATCATTTCCTTCTCCACTCCT',
 '>Sequence 2': 'CCCACGCAGCCGCCCTCCTCCCCGGTCACTGACTGGTCCTG',
 '>Sequence 3': 'TCGACCCTCTGGAACCTATCAGGGACCACAGTCAGCCAGGCAAG',
 '>Sequence 4': 'AAAACACTTGAGGGAGCAGATAACTGGGCCAACCATGACTC'}

Таким образом, c обработка этих строк:

In [171]: [len(val) for key,val in alist]                                                      
Out[171]: [41, 41, 44, 41]
In [172]: [val.count('T') for key,val in alist]                                                
Out[172]: [16, 7, 6, 6]
In [173]: [val.count('C') for key,val in alist]                                                
Out[173]: [12, 21, 15, 10]
1 голос
/ 07 марта 2020

Я только что нашел этот тезис, может быть, он поможет вам продолжать искать. https://pastel.archives-ouvertes.fr/tel-01762479/document

TL; DR https://en.wikipedia.org/wiki/LCP_array https://en.wikipedia.org/wiki/Suffix_array

python https://louisabraham.github.io/notebooks/suffix_arrays.html

...