使用numpy.loadtxt将numpy.searchsorted方法应用于从textfile加载的数组

时间:2017-05-05 10:55:16

标签: python arrays numpy large-data

我目前正致力于生物信息学项目,我需要解决以下问题。

我有一个文本文件" chr1.txt"包含两列:染色体上的位置和布尔变量True或False。

0假
10000真实 10001真实 10005假
10007真实 10011错误
10013真实 10017错误
10019错误 10023错误 10025是真的 10029真实 10031错误 10035真实 10037错误
....
该数据意味着从0到10000的区域是重复的或(=不可映射的 - >假),从10000到10005是唯一的(=可映射的 - >真),从10005到10007再次重复等等。该文件在248	 946Ɩ处结束,并且具有15&#3948' 271行。要找到问题的一般解决方案,我想将文件限制为您可以在上面看到的行。

我想将此文本文件加载到由两列组成的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')])

这对我来说并不完美,因为我希望第二列被识别为布尔类型,但我没有找到方法。

接下来我想在位置10000和10037之间抛出一个随机数。

In [49]: np.random.randint(10000,10037)
Out[49]: 10012

现在我想将numpy.searchsorted方法应用于我的数组的第一列,以确定我的基因组是否在该位置是唯一可映射的。所以在这种情况下我想要的输出是5(我的数组中元素的索引(10011,b&#39; f&#39;))。如果我试图提取仅包含第一列 - 位置的数组,我会收到错误:

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

我想这是因为我的阵列确实没有两列

In [40]: chr1.shape
Out[40]: (15,)

那么如何使用我现有的数组仅提取位置并对其应用searchsorted方法?我应该以不同的方式将我的文本文件加载到数组中,以便实际上有两列,首先是整数类型,第二列是布尔值吗?

extracted_array=[0,10000,10001,10005,10007,10011,10013,10017,10019,10023,10025,10029,10031,10035,10037]
np.searchsorted(extracted_array,10012)-1
Out[58]: 5

然后我会查找找到的索引,无论第二个参数是true还是false,并且如果位置在可映射区域内,则能够得出结论。

真的很感谢你的帮助!

1 个答案:

答案 0 :(得分:1)

我们可以使用position start提取与chr1['position start']相对应的数据,对于第二个字段也是如此。我们将得到有效的布尔数组,并与'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)获取数据和掩码/布尔数组 -

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!