我有一个细菌基因组,如何将其随机切成Python中的150bp-long DNA片段



如何将其随机切成python中的150bp-long片段?我想将其切成1000次,并每次一起汇总所有片段。这是对计算模仿光明测序的。

这是一个示例:

seq = 'ATGGAAAAAGAGTATACGATTGGATTAGATATTGGGACAAATTCGGTTGGATGGGCAGTGTTGACGGATG'
len(seq)=70

我想将此字符串随机切成5个较小的字符串,而固定的长度为10,而不会弄乱字母的原始顺序。预期结果:

seq1= ['ATGGAAAAAG', 'AGTATACGAT', 'TGGATTAGAT', .......]

是这样:

seq1= seq[0:10] + seq[10:20] + seq[20:30] + seq[30:40] + seq[40:50]

,但我希望它是随机的,而不是彼此接近。

对于seq [n:n 10],n是切片的起点。我需要它是随机的,这意味着我会随机选择一个起点,并在该起点取出10bp-l-l-l-l-l-tne DNA切片。然后,我继续将DNA切成随机的起点。

然后我需要一次又一次地进行相同的切片,总共10次:

seq2=['', '', '', .....]
seq3=['', '', '', .....]
seq4=['', '', '', .....]
seq5=['', '', '', .....]
seq6=['', '', '', .....]
seq7=['', '', '', .....]
seq8=['', '', '', .....]
seq9=['', '', '', .....]
seq10=['', '', '', .....]

,然后池seq1 -seq10一起。

谢谢。

我只会选择一个随机起点,然后从那里创建一个子字符串。由于样本长度,您的起点将排除最后150个字符。

然后,我将列出以后的轻松操作。

(我在下面创建一个随机DNA字符串进行测试。)

from random import randint, choice
#just for testing we will assign seq randomly.
seq = ''.join(choice(['A', 'C', 'G', 'T']) for pony in range(1000))
sample_length = 150
number_of_samples = 1000
samples = []
for pony in range(number_of_samples):
    sample_start = randint(0, len(seq) - sample_length)
    samples += [seq[sample_start:sample_start+sample_length]]
print(samples[0])
print(samples[1])

如果您需要多次执行此操作,则可以随时将上述功能放入一个功能中,然后执行以下操作:

samples_list = [do_func() for pony in range(10)]
#calculate how much extra space there is
extra_length = total_length-string_count*string_length
#choose how to allocate extra space
gaps = np.random.choice(extra_length,string_count)
gaps.sort()
gaps = np.diff(gaps)
#we now have a list of random numbers that add up to extra_length
start = 0
end = start+string_length
seq1 = [seq[start:end]]
for string_index in range(string_count-1):
   #each string skips a random distance determined by our gaps variable
   start = end+gaps[string_index]
   end = start+string_length
   seq1.append(seq[start:start+string_length])

最新更新