2013-05-22 94 views
1

下一个报头我有我需要结合仅保持从A某些列中的两个numpy的阵列 - 大小(888, 1114253),取决于我在B行 - 大小(555861, 3)合并两列在numpy的阵列

问题是A的标题是55730:每列都有两个值!

换句话说,我想获得唯一的A其中报头对应于B的行中的列,但在A每一列是“双重”

一个例子阐明:

A

family id mum dad rs1 rs2 rs3 rs4 rs5 rs6 rs7 rs8 rs9 rs10 rs11 rs12 
    1 1 4 6 A T A A T T C C G G A T A G A A G A T A G G C C 
    2 2 7 9 T A G A C T C T G A T T A A A C G G T A C C C T 
    3 3 2 8 T T G G C T C T G G A T A G A C G G T T C C C C 
    4 4 5 1 A A A A T T C C G A T T A A A A G A T A G C C T 

因为在这个文件中的每个rsxxx列标题有两个相应的专栏中,我必须找到一种方法,把它们放在一起,这样我就可以读取该文件作为阵列

B

1 rs1 2345 
1 rs2 2346 
2 rs5 2348 
4 rs8 2351 
4 rs12 2360 

所需的输出是

Output

family id mum dad rs1 rs2 rs5 rs8 rs12 
    1  1 4 6 A T A A G G A A C C 
    2  2 7 9 T A G A G A A C C T 
    3  3 2 8 T T G G G G A C C C 
    4  4 5 1 A A A A G A A A C T 

想法?

在控制台

B

array([['1', 'rs3094315', '752566'], 
     ['1', 'rs12562034', '768448'], 
     ['1', 'rs3934834', '1005806'], 
     ..., 
     ['23', 'rs2032612', '21866491'], 
     ['23', 'rs2032621', '21872738'], 
     ['23', 'rs2032617', '21896261']], 
     dtype='<S10') 
+1

你能告诉您的数据看起来怎么样在numpy的(输出的例子安慰)?因为现在我们只看到纯文本。 – joris

+1

现在我展示了“B”文件的外观......实际上我甚至无法读取“A”,因为第一列与其他行的列数不同...... – Alice

+0

要读取您可以使用NP。loadtxt(A_txt,skiprows = 1),或者在第一行中创建具有适当列数的另一个A_txt。我仍然没有得到你想要做的事B –

回答

2

它看起来像每一列被两个空格隔开,但每个基因对由一个空格分开。如果是这样的话,你可以使用

delimiter=' ' #two spaces 

np.loadtxt

import numpy as np 
from StringIO import StringIO # for example file 

a = StringIO("""family id mum dad rs1 rs2 rs3 rs4 rs5 rs6 rs7 rs8 rs9 rs10 rs11 rs12 
1 1 4 6 A T A A T T C C G G A T A G A A G A T A G G C C 
2 2 7 9 T A G A C T C T G A T T A A A C G G T A C C C T 
3 3 2 8 T T G G C T C T G G A T A G A C G G T T C C C C 
4 4 5 1 A A A A T T C C G A T T A A A A G A T A G C C T """) 


nrs = 12  # number of `rs` columns, for dtype 
dt = 'int,'*4 + 'S10,'*nrs 

A = np.genfromtxt(a, delimiter=' ', names=True, dtype=dt) 

A

array([ (1, 1, 4, 6, ' A T', 'A A', 'T T', 'C C', 'G G', 'A T', 'A G', 'A A', 'G A', 'T A', 'G G', 'C C'), 
     (2, 2, 7, 9, ' T A', 'G A', 'C T', 'C T', 'G A', 'T T', 'A A', 'A C', 'G G', 'T A', 'C C', 'C T'), 
     (3, 3, 2, 8, ' T T', 'G G', 'C T', 'C T', 'G G', 'A T', 'A G', 'A C', 'G G', 'T T', 'C C', 'C C'), 
     (4, 4, 5, 1, ' A A', 'A A', 'T T', 'C C', 'G A', 'T T', 'A A', 'A A', 'G A', 'T A', 'G C', 'C T')], 
     dtype=[('family', '<i8'), ('id', '<i8'), ('mum', '<i8'), ('dad', '<i8'), ('rs1', 'S10'), ('rs2', 'S10'), ('rs3', 'S10'), ('rs4', 'S10'), ('rs5', 'S10'), ('rs6', 'S10'), ('rs7', 'S10'), ('rs8', 'S10'), ('rs9', 'S10'), ('rs10', 'S10'), ('rs11', 'S10'), ('rs12', 'S10')]) 

然后从B访问仅列,这样做:

b = StringIO("""1 rs1 2345 
1 rs2 2346 
2 rs5 2348 
4 rs8 2351 
4 rs12 2360""") 

B = np.genfromtxt(b, usecols=[1], dtype='S10') 

现在,使用A[B]

A[B] 
array([(' A T', 'A A', 'G G', 'A A', 'C C'), 
     (' T A', 'G A', 'G A', 'A C', 'C T'), 
     (' T T', 'G G', 'G G', 'A C', 'C C'), 
     (' A A', 'A A', 'G A', 'A A', 'C T')], 
     dtype=[('rs1', 'S10'), ('rs2', 'S10'), ('rs5', 'S10'), ('rs8', 'S10'), ('rs12', 'S10')]) 

或者,如果你想前四列太:

A[['family', 'id', 'mum', 'dad'] + list(B)] 
array([(1, 1, 4, 6, ' A T', 'A A', 'G G', 'A A', 'C C'), 
     (2, 2, 7, 9, ' T A', 'G A', 'G A', 'A C', 'C T'), 
     (3, 3, 2, 8, ' T T', 'G G', 'G G', 'A C', 'C C'), 
     (4, 4, 5, 1, ' A A', 'A A', 'G A', 'A A', 'C T')], 
     dtype=[('family', '<i8'), ('id', '<i8'), ('mum', '<i8'), ('dad', '<i8'), ('rs1', 'S10'), ('rs2', 'S10'), ('rs5', 'S10'), ('rs8', 'S10'), ('rs12', 'S10')]) 
+0

太棒了!任何时候,每列由一个选项卡分隔,而不是两个空格 - 但我不能在问题中键入“选项卡”..你怎么能在问题中写入选项卡字符?无论如何,我试过delimiter =“”#tab,它也可以工作! – Alice

+0

使用'delimiter ='\ t'' – askewchan

+0

这是永无止境的(我有一个2G文件,我的笔记本电脑是Mac OS X,2.66 GHz Intel Core 2 Duo) - 有没有办法加快速度? – Alice