需要一些想法。我确信有一种聪明的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]])
任何聪明的数组操作建议都欢迎!
答案 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