擅长:python、mysql、java
<p>我在这里看到的主要问题是你把所有的东西都写进了一个文件。这样做没有意义。您创建的大型输出文件是非常冗余的,并且在您进行分析时将其重新加载是没有帮助的。在</p>
<p>最初加载文件后,您感兴趣的每个窗口都是<code>a[x:x+100]</code>,有些是<code>x</code>。实际上根本不需要显式地生成这些窗口:这样做不会有任何好处。遍历,并直接从a的每个窗口生成这些矩阵。在</p>
<p>如果你真的需要整个东西,把它生成一个numpy数组。另外,如果我不使用任何简并的基代码,用0,1,2,3表示A,C,G,T,将序列转换成uint8s。这有助于加快速度,尤其是如果你需要在任何点上取补码,这可以通过简单地修改位来完成。在</p>
<p>Numpy可以使用<code>stride_tricks</code>非常有效地生成数组,如前所述<a href="http://www.rigtorp.se/2011/01/01/rolling-statistics-numpy.html" rel="nofollow">in this blog post</a>:</p>
<pre><code>def rolling_window(a, window):
shape = a.shape[:-1] + (a.shape[-1] - window + 1, window)
strides = a.strides + (a.strides[-1],)
return numpy.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)
handle = open("U00096.2.fas.txt", "r")
a = handle.readlines()[1:]
a = ''.join([x.strip() for x in a])
b = numpy.array([x for x in a], dtype=numpy.character)
rolling_window(b,100)
</code></pre>
<p>或者,转换为整数:</p>
^{pr2}$
<p>在我的机器上这个代码比你的快十倍。在</p>