【发布时间】:2018-10-16 03:17:59
【问题描述】:
我正在尝试构建一个数组,其中每一行包含来自不同序列的 k-mers(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:索引 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: 列表赋值索引超出范围
有没有更好的方法来做到这一点?
【问题讨论】:
-
请注意:范围默认从 0 开始,因此
reange(0, len(kmer))与range(len(kamer))完全相同。 -
不太清楚您要归档的内容。您在此处提供的代码不会重现该错误,因为可能您没有定义该类。看看minimal reproducible example。无论如何,如果您输入到
self.profile的数组长度不同,numpy 就不是您想要的:[stackoverflow.com/questions/3386259/…。 -
如果我正确理解了您的代码,并且它按照您的想法运行,那么您只需将
self.profile[i] = self.kmers替换为self.profile.append(self.kmers)就可以了。这样,self.profile将包含长度为 k 和更短的序列列表,其中包含self.motifs中指定的碱基,但不是self.motifs中给出的顺序。如果这是您想要的,我会发布一个对您的代码稍作更正的答案。 -
@MarcosWappner 我想要 self.profile[i] = self.kmers 的原因是我想要一个来自 self.motif 中每个序列的 k-mers 列表。如果我使用 self.profile.append(self.kmers) 它将它们连接起来。
-
您不会将它们连接起来,因为 self.kmer 是一个列表(您应该在某处初始化)。或者更确切地说,我认为这是一个来自你所做的事实的列表
self.kmer.append(kmer[q])。列表可以包含任何类型的项目,并且可以根据需要混合和匹配。 self.kmers 将是一个(不断增长的)列表,而 self.profile 将包含该列表的所有阶段。
标签: python arrays python-3.x bioinformatics