根据内容(特定值的计数)对numpy数组中的列重新排序

时间:2017-03-09 11:34:50

标签: python arrays sorting numpy

需要一些想法。我确信有一种聪明的pythonic方式可以做到这一点,而不需要求助于一个明智的细胞'重建数组。

背景 我试图操纵我们用来整理群众工人判断的系统中的大型摘要。我正在格式化数据,以便以合适的格式推送OpenBugs,甚至可能是后来的PyMC。

我有一个大型np数组,格式如下,最多有500个cols和1000个行。这是一个简化的例子:

a = np.array([['a','b','c','d','e'],
          [1, 2, 3, 4, 5],
          [1, 2, 'na', 'na','na'],
          [1, 2, 'na', 4, 5]])

期望的结果:我想重新排序(理想情况下)数据的列,以便按照列中显示的'na'的数量对它们进行排序。注意我想要按照col排序。而是对列本身进行排序。

我想要一个选项来指定单独保留多少个前导列(未移动),因为这会不时地依赖。并按升序/降序排序。第一行是标题,其值是col的索引。所有值都是int或' na&#39 ;,标题是一个字符串。

所以在这个例子中。如果我想保留'a' col,并按'na的降序排序,则输出为:

a = np.array([['a','c','d','e','b'],
              [1, 3, 4, 5, 2],
              [1, 'na', 'na', 'na',2],
              [1, 'na', 4, 5, 2]])

任何聪明的数组操作建议都欢迎!

1 个答案:

答案 0 :(得分:0)

一种方法是 -

N = 1 # No. of leading cols to be kept
out = a[:,np.r_[:N,(-(a[:,N:]=='na').sum(0)).argsort()+N]]

基本上,我们选择N之后的所有列,与'na'进行比较,并使用.sum(0)获取每列的计数,并按降序获取argsort索引。最后,我们使用这些N索引与一系列索引up argsort连接,并将索引编入输入数组的列,以便为我们提供所需的输出。

样品运行 -

In [89]: a
Out[89]: 
array([['a', 'b', 'c', 'd', 'e'],
       ['1', '2', '3', '4', '5'],
       ['1', '2', 'na', 'na', 'na'],
       ['1', '2', 'na', '4', '5']], 
      dtype='|S2')

In [90]: N = 1 # No. of leading cols to be kept

In [91]: a[:,np.r_[:N,(-(a[:,N:]=='na').sum(0)).argsort()+N]]
Out[91]: 
array([['a', 'c', 'd', 'e', 'b'],
       ['1', '3', '4', '5', '2'],
       ['1', 'na', 'na', 'na', '2'],
       ['1', 'na', '4', '5', '2']], 
      dtype='|S2')

In [92]: N = 2 # No. of leading cols to be kept

In [93]: a[:,np.r_[:N,(-(a[:,N:]=='na').sum(0)).argsort()+N]]
Out[93]: 
array([['a', 'b', 'c', 'd', 'e'],
       ['1', '2', '3', '4', '5'],
       ['1', '2', 'na', 'na', 'na'],
       ['1', '2', 'na', '4', '5']], 
      dtype='|S2')

如果具有相同计数'na'的列的顺序无关紧要,那么更高效的解决方案是避免使用negation输入数组来获得该降序,而是通过反转{{ 1}}没有否定的索引,就像这样 -

argsort