2013-05-27 55 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