2017-03-09 54 views
0

需要一些关于此的想法。我确信有一个聪明的pythonic方法来做到这一点,而不是诉诸阵列的'单元格'重建。根据内容重新排列numpy数组中的列(具体值的计数)

背景: 我试图操纵我们用来整理众包工作者判断的系统中的一个大型摘要。我正在格式化数据,因此它采用合适的格式来推送OpenBugs以及可能后来的PyMC。

我有以下格式的大型np数组,有多达500列和许多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'数进行排序的列。 NB我不要想排序一个上校。而是自己对列进行排序。

我想要一个选项来指定有多少主导列独立(不移动),因为这取决于时间。并按升序/降序排序。最上面一行是一个标题,谁的值指向列。所有的值都是int或'na',而头是一个字符串。

所以在这个例子中。如果我想的'na降号码留在原地'a'关口,并排序输出将是:

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

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

+0

发布的解决方案是否适合您? – Divakar

回答

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与这些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用于获取列的顺序通过,而不是反转降序argsort索引没有否定,像这样 -

a[:,np.r_[:N,(a[:,N:]=='na').sum(0).argsort()[::-1]+N]]