2013-05-27 56 views
-1

我需要根据数组B的一列对数组A列进行排序,但顺序由字符串给出:我想要数组A列按照第二列排序阵列B的(B[:,1]Numpy:顺序数组作为其他数组 - 按字符串顺序

数组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 

阵列乙

1 rs1 2345 
1 rs5 2346 
2 rs6 2348 
4 rs8 2351 
4 rs12 2360 
3 rs2 2456 
2 rs3 2453 
3 rs10 5672 
1 rs9 78923 
5 rs7 5738 
2 rs4 3546 
6 rs11 6354 

希望的输出:

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

我希望这已经够清楚了!谢谢!

+0

可能重复(由同一用户):http://stackoverflow.com/questions/16693122/combine-two-columns-under-one-header-in-numpy-array – hooy

+0

我不会这么说... – Alice

回答

0

正如已指出了意见,这基本上是这个问题的一个副本: Combine two columns under one header in Numpy array

所以这个答案是明确的削减,并从那里粘贴,只有我使用的标签定界符,因为我明白这就是你正在使用的。

首先我们从A数组开始,使用StringIO生成示例数据。

import numpy 
from StringIO import StringIO 

a = StringIO("""family\tid\tmum\tdad\trs1\trs2\trs3\trs4\trs5\trs6\trs7\trs8\trs9\trs10\trs11\trs12 
1\t1\t4\t6\tA T\tA A\tT T\tC C\tG G\tA T\tA G\tA A\tG A\tT A\tG G\tC C 
2\t2\t7\t9\tT A\tG A\tC T\tC T\tG A\tT T\tA A\tA C\tG G\tT A\tC C\tC T 
3\t3\t2\t8\tT T\tG G\tC T\tC T\tG G\tA T\tA G\tA C\tG G\tT T\tC C\tC C 
4\t4\t5\t1\tA A\tA A\tT T\tC C\tG A\tT T\tA A\tA A\tG A\tT A\tG C\tC T""") 

dt = 'int,int,int,int,S3,S3,S3,S3,S3,S3,S3,S3,S3,S3,S3,S3' 
A = numpy.genfromtxt(a, delimiter='\t', names=True, dtype=dt) 

然后我们从B阵列获得列1,同前面的问题:

b = StringIO("""1\trs1\t2345 
1\trs5\t2346 
2\trs6\t2348 
4\trs8\t2351 
4\trs12\t2360 
3\trs2\t2456 
2\trs3\t2453 
3\trs10\t5672 
1\trs9\t78923 
5\trs7\t5738 
2\trs4\t3546 
6\trs11\t6354""") 

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

在这一点上,如前面的问题进行了说明,你可以通过订购的rsB,使用A[B]。或者,如果你想要的所有列:

A[['family','id','mum','dad']+list(B)] 

如果您希望打印出来的东西更紧密地代表你的榜样输出(制表符分隔列),你可能只是做这样的事情:

cols = ['family','id','mum','dad']+list(B) 
result = A[cols] 

for line in [cols]+list(result): 
    print '\t'.join([str(col) for col in line]) 

我对numpy没有太多经验,因此可能有更简单的方法直接用numpy格式化输出,但这至少是一种可能的解决方案。

+0

我的巨大问题是我必须从2G文件中提取“列表(B)”,并且需要花费DAYS - 我无法分割文件,因为我需要提取搜索整个文件的“B”值以及所有文件我发现的解决方案告诉分裂文件或数组。我无法用pytables找到一种方法,这看起来更快。有没有解决方案?谢谢。 – Alice