【问题标题】:How can I replicate python list custom sort functionality with Numpy array?如何使用 Numpy 数组复制 python 列表自定义排序功能?
【发布时间】:2020-08-28 10:26:14
【问题描述】:

我有以下代码将零移动到标准 Python 列表的一端

def _moveZeros(x):    
    if x==0:
        return x
    else:
        return -1

l = [1,0,5,6,0,0,7,2]
l.sort(key=_moveZeros)
print(l)

这种情况下的输出是 [1,5,6,7,2,0,0,0]

如何使用 Numpy 数组完成类似的操作?

【问题讨论】:

  • 嗯np.sort?已经实施了。
  • 是的,但我只想移动零。我不相信 np.sort 接受传递“key”参数来指定自定义评估函数
  • 您可以使用所需的排序值构造一个新数组,并将argsort 应用于该数组。这为您提供了将重新排序原始索引的索引。

标签: python list numpy sorting numpy-ndarray


【解决方案1】:

花式索引在 numpy 中大有帮助 :)

import numpy as np
a = np.array([1,0,5,6,0,0,7,2])

a = np.hstack([a[a != 0], a[a == 0]])

我本身并不是在排序,我正在创建 a 的两个新视图,一个包含所有不同于 0 的元素,另一个包含所有 0,然后水平堆叠作为一个新数组。

如果您想要 0 以外的数字,只需将其替换为 k

【讨论】:

    【解决方案2】:

    不是很优雅,但很有效:

    import numpy as np
    aaa = [1,0,5,6,0,0,7,2]
    zero_idxs = np.where(np.array(aaa)==0)[0]
    non_zero_idxs = [i for i in range(len(aaa)) if i not in zero_idxs]
    np.hstack((np.array(aaa)[non_zero_idxs], np.zeros((len(zero_idxs)), dtype=int)))
    

    返回

    array([1, 5, 6, 7, 2, 0, 0, 0])
    

    【讨论】:

    • 谢谢我有类似的东西,尽管使用 argindex 可能更丑陋。希望避免循环!
    • 我想对于正在学习的人来说,我的答案非常易读,但@Alberto 给出了最pythonic的答案:)
    【解决方案3】:

    在这种情况下,hstack 方法很好,但如果您在更一般的情况下需要这种方法:

    您可以使用所需的排序值构造一个新数组,并将 argsort 应用于该数组。这为您提供了将重新排序原始索引的索引。

    In [86]: l = np.array([1,0,5,6,0,0,7,2])                                                               
    In [87]: m = l==0                                                                                      
    In [88]: m                                                                                             
    Out[88]: array([False,  True, False, False,  True,  True, False, False])
    In [89]: i = np.argsort(m)                                                                             
    In [90]: i                                                                                             
    Out[90]: array([0, 2, 3, 6, 7, 1, 4, 5])
    In [91]: l[i]                                                                                          
    Out[91]: array([1, 5, 6, 7, 2, 0, 0, 0])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-09
      • 1970-01-01
      • 2011-11-01
      • 2018-07-13
      • 2018-08-26
      • 2014-03-30
      • 1970-01-01
      相关资源
      最近更新 更多