使用for循环构建NumPy数组(列表列表?)

我正在尝试构建一个数组,其中每行包含来自不同序列的k聚体(k长度核苷酸串) . 我一直在读你不能真的有空数组,我很难尝试使用追加 .

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:索引0超出了0号轴的大小为0”

我意识到这是因为我没有指定数组的形状,但我只知道会有多少行,我不知道会有多少列(列大小取决于有多少k-mers是在每个序列中找到) .

如果我尝试将其列为“列表列表”:

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)

3 years ago

从评论中收集信息,我认为您想要的是以下内容:给定一个主题列表(在您的情况下,每个50个碱基长的核苷酸串),您需要出现的长度为k的子序列(k-mers)每一个 . 编写代码的pythonic方式更多:

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中,如果您只是使用它来访问列表,数组或任何可迭代的内容,则不需要遍历索引;你可以循环遍历迭代本身 . 检查 zipenumerate 以获得更大的灵活性 .

最后一件事:请注意 self.kmer 将是一个包含 [kmer1, kmer2, kmer4, kmer6] 的列表,依此类推(即,yor motif中的kmers),但您将无法区分主题 . 此外, self.profile 将是包含 [[kmer1], [kmer1, kmer2], [kmer1, kmer2, kmer4]] 的列表列表,依此类推 .

如果你不关心 self.profile (因为你可以在以后逐步 Build 它),你可以用一个大的列表理解来做所有事情:

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

编辑:两件额外的事情

请注意,这样, kmers 将重复序列 . 为了避免这种情况,你可以写一个额外的小费( if km not in self.kmers ),或者更确切地说使用sets,以避免重复 .

如果你确实想要通过motif分隔的kmers列表,你可以通过列表理解以更简单的方式完成:

self.profile = [] 
for mot in motifs:
    individual_km = [km for km in kmer if km in mot]
    self.profile.append(individual_km)

3 years ago

Numpy数组不能像python列表和字典一样动态增长 . 事实上,最后我读到,任意增长Numpy数组,创建一个新的数组到所需的形状,然后从原始数组对象复制,这不是太优 .

为了达到你想要的结果,我必须首先创建一个嵌套的列表对象,然后在迭代完成后立即创建Numpy数组 . 只要嵌套列表对象的大小相等,您就可以使用以下内容:

my_profile = []

...你的循环代码......

self.profile = np.array(my_profile)