【问题标题】:Sort array's rows by another array in Python在 Python 中按另一个数组对数组的行进行排序
【发布时间】:2012-01-25 18:12:26
【问题描述】:

我正在尝试按另一个数组的值对一个数组的行进行排序。例如:

import numpy as np
arr1 = np.random.normal(1, 1, 80)
arr2 = np.random.normal(1,1, (80,100))

我想按降序对arr1 进行排序,并保持arr1arr2 之间的当前关系(即,在对两者进行排序之后,arr1[0]arr2[0, :] 的行是一样)。

【问题讨论】:

    标签: python numpy sorting


    【解决方案1】:

    如下使用argsort

    arr1inds = arr1.argsort()
    sorted_arr1 = arr1[arr1inds[::-1]]
    sorted_arr2 = arr2[arr1inds[::-1]]
    

    此示例按降序排序。

    【讨论】:

    • 最初这个解决方案不适用于我的数组,但后来我意识到len(arr1) 必须匹配arr2。例如,我有一个 (5,) 向量和一个 (2, 5) 数组,我想按第一个向量按列排序。我使用像arr2.T[arr1.argsort()].T 这样的两个转置来做到这一点,尽管可能有一个更优雅的解决方案不需要两个转置。
    • 你确定它是按降序排列的吗?当我尝试它时,它肯定看起来像是在上升:arr = np.array([4, 1, 5, 3, 2]); arr[np.argsort(arr)] 给了我输出 [1, 2, 3, 4, 5]
    • @hellobenallan argsort 按升序排序,但此解决方案以相反的顺序访问索引(使用[::-1])以降序给出答案。
    • @ZX9 你说的很对,你的编辑让事情变得更清楚了。感谢您的跟进。
    • 可能有用的注意事项:要像这样沿轴排序,即,如果您使用 argsort(axis=N),则必须使用 numpy 的 take_along_axis 而不是高级切片进行排序。
    【解决方案2】:

    使用 zip 功能:zip( *sorted( zip(arr1, arr2) ) ) 这将满足您的需求。

    现在解释一下: zip(arr1, arr2) 将合并这两个列表,所以你有 [(0, [...list 0...]), (1, [...list 1...]), ...] 接下来我们运行sorted(...),默认情况下根据元组中的第一个字段进行排序。 然后我们再次运行zip(...),它从已排序的元组中获取元组,并从元组中的第一个元素(来自arr1)和第二个元素(来自arr2)创建两个列表。

    【讨论】:

      猜你喜欢
      • 2020-03-19
      • 1970-01-01
      • 2016-04-30
      • 2011-02-10
      • 2019-10-16
      • 1970-01-01
      • 2019-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多