-1

我需要根据数组 B 的一列对数组 A 的列进行排序,但顺序由字符串给出:我希望数组 A 的列像数组 B 的第二列一样排序 ( B[:,1])

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

我希望这足够清楚!谢谢!

4

1 回答 1

0

正如评论中所指出的,这本质上是这个问题的重复: 在 Numpy 数组中的一个标题下合并两列

所以这个答案基本上是从那里剪切和粘贴的,只有我使用制表符作为分隔符,因为我知道这就是你正在使用的。

首先,我们从使用 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])

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

于 2013-05-27T09:51:58.560 回答