Numpy:按字符串ord将数组作为其他数组排序

2024-06-01 14:50:19 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我希望这足够清楚!谢谢您!你知道吗


Tags: 顺序数组familyrs3rs2rs1rs9rs7
1条回答
网友
1楼 · 发布于 2024-06-01 14:50:19

正如评论中所指出的,这基本上是这个问题的重复: Combine two columns under one header in Numpy array

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

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

在这一点上,正如前面问题中所解释的,您可以使用A[B]获得按B排序的rs列。或者如果您需要所有列:

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格式化输出,但这至少是一种可能的解决方案。你知道吗

相关问题 更多 >