Numpy:将数组作为其他数组 - 按字符串顺序排列

时间:2013-05-27 07:49:53

标签: python arrays string numpy

我需要根据数组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

我希望这很清楚!谢谢!

1 个答案:

答案 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获取BA[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格式化输出,但这至少是一种可能的解决方案。