【问题标题】:Reorder columns in numpy array based on content (count of a specific value)根据内容重新排序 numpy 数组中的列(特定值的计数)
【发布时间】:2017-03-09 11:34:49
【问题描述】:

需要一些想法。我确信有一种巧妙的 Python 方式可以做到这一点,而无需诉诸于“单元格”重建数组。

背景: 我正在尝试从我们用来整理群众工作者判断的系统中操纵一个大型摘要。我正在格式化数据,以便它采用合适的格式来推送 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' 的数量排序。注意我不想想按列排序。而是对列本身进行排序。

我想要一个选项来指定有多少前导列被单独保留(不移动),因为这取决于时间。并按升序/降序排序。顶行是标题,谁的值索引 col。所有值都是 int 或 'na',标题是字符串。

在这个例子中。如果我想保留'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]])

欢迎任何巧妙的数组操作建议!

【问题讨论】:

  • 发布的解决方案对您有用吗?

标签: python arrays sorting numpy


【解决方案1】:

一种方法是 -

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]]

【讨论】:

    猜你喜欢
    • 2017-12-27
    • 2021-01-17
    • 2020-06-17
    • 2014-08-11
    • 2019-10-10
    • 2019-03-17
    • 2021-12-19
    • 1970-01-01
    • 2020-12-10
    相关资源
    最近更新 更多