【问题标题】:Numpy: order array as other array - by string orderNumpy:将数组排序为其他数组 - 按字符串顺序
【发布时间】:2013-05-27 07:49:52
【问题描述】:

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

我希望这已经足够清楚了!谢谢!

【问题讨论】:

标签: python arrays string numpy


【解决方案1】:

正如 cmets 中所指出的,这本质上是这个问题的重复: 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')

此时,如前面问题中所述,您可以使用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 格式化输出,但这至少是一种可能的解决方案。

【讨论】:

  • 我的大问题是我必须从 2G 文件中提取“list(B)”,而且需要 DAYS - 我无法拆分文件,因为我需要提取“B”值搜索整个文件和我发现的所有解决方案都告诉拆分文件或数组。我也找不到使用 pytables 的方法,这似乎更快。有什么解决方案吗?谢谢。
猜你喜欢
  • 2018-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多