我需要根据数组B的一列对数组A列进行排序,但顺序是由字符串给出的:我希望数组A列的排序方式与数组B的第二列(B[:,1]
)< / p>
阵列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
阵列B
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 :(得分:0)
正如评论中指出的那样,这基本上是这个问题的重复: Combine two columns under one header in Numpy array
所以这个答案基本上是从那里剪切和粘贴的,只有我使用制表符分隔符,因为我知道你正在使用它。
首先,我们从使用StringIO的A数组开始生成样本数据。
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')
此时,正如前面问题中所述,您可以使用rs
获取B
按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])
如果您希望打印出更接近代表示例输出(制表符分隔列)的内容,您可以执行以下操作:
{{1}}
我对numpy没有多少经验,所以可能有更简单的方法直接使用numpy格式化输出,但这至少是一种可能的解决方案。