2017-05-05 4 views
3

現在、私はバイオインフォマティクスプロジェクトに取り組んでおり、次の問題を解決する必要があります。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番目の引数が真か偽か見つかったインデックスを見て、位置がマップ可能な領域内にある場合には結論を作ることができるだろう。

本当にありがとうございます。

答えて

1

position startに対応するデータをchr1['position start']で抽出し、同様に2番目のフィールドで抽出することができます。 't'との比較で有効なブール値の配列を取得します。

indx = chr1['position start'] 
mask = chr1['mappable']=='t' 
rand_num = np.random.randint(10000,10037) 
matched_indx = np.searchsorted(indx, rand_num)-1 

if mask[matched_indx]: 
    print "It is mappable!" 
else: 
    print "It is NOT mappable!" 

1)データとマスクを取得/ブール配列 - -

したがって、我々のようなので、1つのアプローチを持っているでしょう)

In [283]: chr1 # Input array 
Out[283]: 
array([( 0, 'f'), (10000, 't'), (10001, 't'), (10005, 'f'), 
     (10007, 't'), (10011, 'f'), (10013, 't'), (10017, 'f'), 
     (10019, 'f'), (10023, 'f'), (10025, 't'), (10029, 't'), 
     (10031, 'f'), (10035, 't'), (10037, 'f')], 
     dtype=[('position start', '<i4'), ('mappable', 'S1')]) 

In [284]: indx = chr1['position start'] 
    ...: mask = chr1['mappable']=='t' 
    ...: 

In [285]: indx 
Out[285]: 
array([ 0, 10000, 10001, 10005, 10007, 10011, 10013, 10017, 10019, 
     10023, 10025, 10029, 10031, 10035, 10037], dtype=int32) 

In [286]: mask 
Out[286]: 
array([False, True, True, False, True, False, True, False, False, 
     False, True, True, False, True, False], dtype=bool) 

2の乱数を取得し、searchsortedを使用し、 IF-ELSEパーツを使用 -

In [297]: rand_num = 10012 # np.random.randint(10000,10037) 

In [298]: matched_indx = np.searchsorted(indx, rand_num)-1 

In [299]: matched_indx 
Out[299]: 5 

In [300]: if mask[matched_indx]: 
    ...:  print "It is mappable!" 
    ...: else: 
    ...:  print "It is NOT mappable!" 
    ...:  
It is NOT mappable! 
+0

ありがとう!これはawsomeです:)私は私の大きなファイルでもそれをテストし、答えを受け入れるために再び来る! – ElMing

関連する問題