現在、私はバイオインフォマティクスプロジェクトに取り組んでおり、次の問題を解決する必要があります。numpy.searchsortedメソッドを、numpy.loadtxtを使用してテキストファイルから読み込まれた配列に適用します。
私は2つの列を含むテキストファイル "chr1.txt"を持っています:染色体上の位置とブール変数TrueまたはFalse。真
0偽
10000真
10001真
10005偽
10007真
10011偽
10013真
10017偽
10019偽
10023偽
10025真
10031 false
10035真
10037偽
....
このデータは、0から10000までの領域は、反復またはであることを意味 (=マップ不可 - >偽)10000から10005まで、ユニーク(=マッピング可能である - >真)、10005から10007までは繰り返し繰り返します。ファイルは248'946'406の位置で終了し、15'948'271行あります。この問題に対する一般的な解決策を見つけるには、ファイルを上記の行に限定したいと思います。
このテキストファイルを、2つの列で構成されるnumpy配列にロードします。そのために私はnumpy.loadtxtを使用:ここで
import numpy as np
with open('chr1.txt','r') as f:
chr1 = np.loadtxt(f, dtype={'names':('start','mappable'),
'formats':('i4','S1')})
が出力されます。
In [39]: chr1
Out[39]:
array([(0, b'f'), (10000, b't'), (10001, b't'), (10005, b'f'),
(10007, b't'), (10011, b'f'), (10013, b't'), (10017, b'f'),
(10019, b'f'), (10023, b'f'), (10025, b't'), (10029, b't'),
(10031, b'f'), (10035, b't'), (10037, b'f')],
dtype=[('position start', '<i4'), ('mappable', 'S1')])
これは私が2番目の列がboolean型として認識されるようにしたいので、私には完璧に見えるが、私はありませんそうする方法が見つからなかった。
として次の私は位置の間で10000および10037.
In [49]: np.random.randint(10000,10037)
Out[49]: 10012
で乱数を投げたい今、私は私のゲノムかどうかを調べるために私の配列の最初の列にnumpy.searchsorted方法を適用したいですその位置で一意的にマッピング可能である。だから私はこの場合の出力として5(私の配列内の要素(10011、b'f ')のインデックス)です。私は、最初の列からなる配列を抽出しようとしていた場合 - 位置を、私はエラーを取得する:
In [21]: chr1[:,0]
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-21-a63d052f1c5d> in <module>()
----> 1 chr1[:,0]
IndexError: too many indices for array
私は私の配列は、実際には2つの列
In [40]: chr1.shape
Out[40]: (15,)
を持っていないため、これがあると思いますでは、どのようにポジションのみを抽出し、既存の配列を使用してそれらに対してsearchsortedメソッドを適用できますか?テキストファイルを別の方法で配列にロードして、本当に2つの列が存在するようにする必要があります。最初は整数型、2番目はブール型です。
それから私は、2番目の引数が真か偽か見つかったインデックスを見て、位置がマップ可能な領域内にある場合には結論を作ることができるだろう。
本当にありがとうございます。
ありがとう!これはawsomeです:)私は私の大きなファイルでもそれをテストし、答えを受け入れるために再び来る! – ElMing