我正在尝试构建一个数组,其中每行包含来自不同序列的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 回答
从评论中收集信息,我认为您想要的是以下内容:给定一个主题列表(在您的情况下,每个50个碱基长的核苷酸串),您需要出现的长度为k的子序列(k-mers)每一个 . 编写代码的pythonic方式更多:
请注意,在python中,如果您只是使用它来访问列表,数组或任何可迭代的内容,则不需要遍历索引;你可以循环遍历迭代本身 . 检查
zip
和enumerate
以获得更大的灵活性 .最后一件事:请注意
self.kmer
将是一个包含[kmer1, kmer2, kmer4, kmer6]
的列表,依此类推(即,yor motif中的kmers),但您将无法区分主题 . 此外,self.profile
将是包含[[kmer1], [kmer1, kmer2], [kmer1, kmer2, kmer4]]
的列表列表,依此类推 .如果你不关心
self.profile
(因为你可以在以后逐步 Build 它),你可以用一个大的列表理解来做所有事情:编辑:两件额外的事情
请注意,这样,
kmers
将重复序列 . 为了避免这种情况,你可以写一个额外的小费(if km not in self.kmers
),或者更确切地说使用sets,以避免重复 .如果你确实想要通过motif分隔的kmers列表,你可以通过列表理解以更简单的方式完成:
Numpy数组不能像python列表和字典一样动态增长 . 事实上,最后我读到,任意增长Numpy数组,创建一个新的数组到所需的形状,然后从原始数组对象复制,这不是太优 .
为了达到你想要的结果,我必须首先创建一个嵌套的列表对象,然后在迭代完成后立即创建Numpy数组 . 只要嵌套列表对象的大小相等,您就可以使用以下内容:
my_profile = []
...你的循环代码......
self.profile = np.array(my_profile)