【问题标题】:Sort array based on value and create new array根据值对数组进行排序并创建新数组
【发布时间】:2021-05-03 20:10:33
【问题描述】:

想象一个二维数组:

a = np.array([[1,1],[1, 0],[0, 0],[0, 0],[0, 0],[1, 1],[1, 1],[0, 1]])

我想根据数组的第一个值对数组进行排序,例如:

[[1,1],[1, 1],[1, 1],[1, 0],[0, 1],[0, 0],[0, 0],[0, 0 ]]

如果我只是使用 .sort() 之类的:

a[::-1].sort(axis=0)

返回的数组如下:

array([[1, 1],
       [1, 1],
       [1, **1**],
       [**1**, 1],
       [0, 0],
       [0, 0],
       [0, 0],
       [0, 0]])

如您所见,粗体 1 曾经是零。为什么函数会翻转我的数字?我搜索了互联网并没有找到任何答案。

【问题讨论】:

    标签: python arrays numpy sorting


    【解决方案1】:

    问题在于,当您传递 axis=0 时,numpy sort 正在对每一列独立进行排序(请参阅文档页面上的 examples)。如果要对行进行排序,则可以改用sorted

    np.array(sorted(a, key=lambda x: x.tolist(), reverse=True))
    

    在你的情况下,结果是

    [[1 1]
     [1 1]
     [1 1]
     [1 0]
     [0 1]
     [0 0]
     [0 0]
     [0 0]]
    

    【讨论】:

      【解决方案2】:

      您所做的排序是对数组中的所有列进行排序,彼此独立, 来自此页面上的第一个示例https://numpy.org/doc/stable/reference/generated/numpy.sort.html

      >>> a = np.array([[1,4],[3,1]])
      >>> np.sort(a)                # sort along the last axis
      array([[1, 4],
             [1, 3]])
      >>> np.sort(a, axis=None)     # sort the flattened array
      array([1, 1, 3, 4])
      >>> np.sort(a, axis=0)        # sort along the first axis
      array([[1, 1],
             [3, 4]])
      

      另请参阅此答案以根据单列对行进行排序:Sorting arrays in NumPy by column

      【讨论】:

        【解决方案3】:

        您可以使用np.lexsort,并独立传递两列,然后颠倒顺序。给定键,lexsort 返回排序后的索引。您需要将第一列放在第二列,因为 lexsort 中的主键是最后一列:

        >>> a[np.lexsort((a[:,1], a[:,0]))][::-1]
         
        array([[1, 1],
               [1, 1],
               [1, 1],
               [1, 0],
               [0, 1],
               [0, 0],
               [0, 0],
               [0, 0]])
        

        这是np.lexsort 在您的数据上的输出:

                         key1     key2 (primary)
        >>> np.lexsort((a[:,1], a[:,0]))
         array([2, 3, 4, 7, 1, 0, 5, 6], dtype=int64)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-04-08
          • 1970-01-01
          • 2013-05-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多