Построить массив NumPy с циклом for (список списков?) - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь построить массив, в котором каждая строка содержит k-мер (нуклеотидные строки длиной k) из другой последовательности.Я читал, что на самом деле вы не можете иметь пустые массивы, и мне было трудно попытаться использовать append.

bases = ['A', 'T', 'C', 'G']
self.profile = np.array([])

    for x in range(1):
        k = self.ksize
        kmer = [''.join(p) for p in itertools.product(bases, repeat=k)]
        for i in range(0, len(self.motifs)):
            for q in range(0, len(kmer)):
                if kmer[q] in self.motifs[i]:
                    self.kmers.append(kmer[q])
                    self.profile[i] = self.kmers

Ошибка, которую я получаю здесь: «IndexError: index 0 выходит за пределыдля оси 0 размером 0 "

Я понимаю, что это потому, что я не указал форму массива, но знаю только количество строк, я не знаю, сколько там столбцовбудет (размер столбца зависит от того, сколько k-меров найдено в каждой последовательности).

Если я попытаюсь сделать его «списком списков»:

bases = ['A', 'T', 'C', 'G']
    self.profile = list()

    for x in range(1):
        k = self.ksize
        kmer = [''.join(p) for p in itertools.product(bases, repeat=k)]
        for i in range(0, len(self.motifs)):
            for q in range(0, len(kmer)):
                if kmer[q] in self.motifs[i]:
                    self.kmers.append(kmer[q])
                    self.profile[i] = self.kmers

Я просто получу: self.profile [i] = self.kmers IndexError: индекс назначения списка вне диапазона

Есть ли лучший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Собирая информацию из комментариев, я думаю, что вам нужно следующее: учитывая список мотивов (в вашем случае, нуклеотидные строки каждые 50 базисных длин), вы хотите получить подпоследовательности (k-мерс) длины kкоторые появляются в каждом.Более питонский способ написания вашего кода:

bases = ['A', 'T', 'C', 'G']
self.profile = []

k = self.ksize
kmer = [''.join(p) for p in itertools.product(bases, repeat=k)]

for mot in self.motifs:
   for km in kmer:
      if km in mot:
         self.kmers.append(km)
         self.profile.append(self.kmers)

Обратите внимание, что в python вам не нужно циклически перебирать индексы, если вы собираетесь использовать его только для доступа к спискам, массивам или любым другимитерация;Вы можете просто перебрать итерацию самой.Проверьте zip и enumerate для большей гибкости.

И последнее: обратите внимание, что self.kmer будет списком, связывающим [kmer1, kmer2, kmer4, kmer6] и т. Д. (Т. Е. Kmers in yor мотив), но выне сможет различить мотивы.Также self.profile будет списком, содержащим [[kmer1], [kmer1, kmer2], [kmer1, kmer2, kmer4]] и т. Д.

Если вас не волнует self.profile (потому что вы можете построить его позже), вы можете делать все с пониманием большого списка:

kmers = [km for mot in motifs for km in kmer if km in mot]

РЕДАКТИРОВАТЬ: две дополнительные вещи

Обратите внимание, что таким образом, kmers будет иметь повторяющиеся последовательности.Чтобы избежать этого, вы можете либо написать дополнительную проверку (if km not in self.kmers), либо использовать sets , чтобы избежать повторения.

Если вы do хотите получить списокKmers разделены мотивами, вы можете сделать это проще с пониманием списка:

self.profile = [] 
for mot in motifs:
    individual_km = [km for km in kmer if km in mot]
    self.profile.append(individual_km)
0 голосов
/ 16 октября 2018

Массивы Numpy плохо оснащены для динамического роста, как списки и словари python.Если факт, последний раз я читал, для произвольного увеличения массивов Numpy, создается новый массив с желаемой формой, а затем делается копия из исходного объекта массива, что не слишком оптимально.

Для достиженияРезультаты, которые вы получите, мне нужно было сначала создать вложенный список объектов, а затем создать массив Numpy сразу после завершения итераций.Пока размер вложенных объектов списка равен, вы можете просто использовать что-то вроде:

my_profile = []

... ваш код зацикливания ...

self.profile = np.array (my_profile)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...