首页 文章

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

提问于
浏览
1

我正在尝试构建一个数组,其中每行包含来自不同序列的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 回答

  • 1

    从评论中收集信息,我认为您想要的是以下内容:给定一个主题列表(在您的情况下,每个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)
    
  • 2

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

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

    my_profile = []

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

    self.profile = np.array(my_profile)

相关问题