Сравните значения в двух строках и затем получите результат, который можно поместить в массив - PullRequest
0 голосов
/ 13 ноября 2011

У меня есть две строки в Python, которые я преобразовал в списки:

Seq1 = [x1,x2,x3,x4]

Seq2 = [y1,y2,y3,y4]

Строки имеют одинаковую длину и состоят только из букв 'a', 'c', 'g' и 'u'.

Затем я создал пустую матрицу len(Seq1) от len(Seq2):

a = numpy.zeros(shape=len(Seq1),len(Seq2))

Далее я хочу сравнить значения списка и поместить 1, если значения совпадают, и 0, если они не совпадают. Значение должно быть помещено в соответствующий элемент массива т.е.

if seq1[0] == seq[0]:
    a[0,0] = [1]
else:
    a[0,0] = [0]

# repeat for all the values.
print a

У меня был цикл, который работал, но он заполнял только первый ряд и столбец. Я вижу, что это проблема с функцией диапазона, такой как Seq1[i] == Seq2[j], но я не могу понять это.

Ответы [ 4 ]

1 голос
/ 13 ноября 2011

Переберите оба списка и сравните:

for x in range(len(Seq1)):
  for y in range(len(Seq2)):
    a[x, y] = (Seq1[x] == Seq2[y])
0 голосов
/ 13 ноября 2011

Я бы вообще не использовал вложенные циклы; внешние методы в numpy могут сделать это за вас:

Python 2.7.1 (r271:86882M, Nov 30 2010, 10:35:34) 
[GCC 4.2.1 (Apple Inc. build 5664)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy
>>> seq1 = "acgu"
>>> seq2 = "aagg"
>>> numpy.equal.outer(map(ord, seq1), map(ord, seq2))
array([[ True,  True, False, False],
       [False, False, False, False],
       [False, False,  True,  True],
       [False, False, False, False]], dtype=bool)
0 голосов
/ 13 ноября 2011

Компактный способ написать цикл:

import itertools

for i1,i2 in itertools.product(xrange(len(Seq1)), xrange(len(Seq2))):
    a[i1,i2] = Seq1[i1] == Seq2[i2]
0 голосов
/ 13 ноября 2011

Я предполагаю, что это вопрос биоинформатики.Цель, однако, неясна для меня.Я перечислил общую систему сопоставления, которую вы можете использовать.

>>> for s1 in xrange(len(seq1)):
...     for s2 in xrange(len(seq2)):
...             if seq1[s1]==seq2[s2]:
...                     a[s1,s2]=1
...             else:
...                     a[s1,s2]=0
...