【问题标题】:How to use the argsort output to order multidimensional arrays如何使用 argsort 输出对多维数组进行排序
【发布时间】:2021-03-14 14:12:30
【问题描述】:

我有一个“数组列表”,我使用 argsort 对这些数组中的每一个进行排序:

import numpy as np    
arr = np.array([[4, 2, 5], [4, 3, 1], [1, 5, 7], [1, 5, 4]])
idxs = arr.argsort(axis=1)
idxs
>>> array([[1, 0, 2],
           [2, 1, 0],
           [0, 1, 2],
           [0, 2, 1]])

对于这 4 个数组中的每一个,我都有一个 3x3 矩阵,我将其保存在“矩阵列表”中:

arr2.shape
>>> (4, 3, 3)

我想使用 idxs 对每个数组的列进行排序。所以对于第一个矩阵,我想重新排列列,如

m1 = arr2[0]
m1 = [:, [1, 0, 2]]

仅将方括号中的 idxs 提供给 arr2 是行不通的,甚至只是尝试将 idxs 应用于它们来自的数组也行不通:

arr[arr.argsort(arr, axis=1)].shape
>>> (4, 3, 3)

【问题讨论】:

  • 我不确定我是否正确理解了这个问题,但是您可以使用argsort 对所有值进行排序,然后可以直接在您的数组上使用返回的索引来按返回的顺序对所有项目进行排序通过 argsort,无论如何idx = argsort(); array[idx]。如果这不是您想要的,请更新您的问题。
  • 我再次阅读了您的问题,[:, [2, 0, 1]] 不是一个有效的单一分配,这也让我困惑了很多次,但[np.arange(3), [2, 0, 1]] 是一个有效的单一分配。
  • [np.arange(3), [2, 0, 1]] 不起作用。只是,正如 Quang Hoang 所建议的,arr[np.arange(arr.shape[0])[:,None], idxs] 为 arr 工作。但是对于 arr2 它会更改行而不是列。

标签: python-3.x numpy sorting indexing numpy-ndarray


【解决方案1】:

您可以使用对索引:

arr2 = np.arange(3*4*3).reshape(4,3,-1)

arr2[np.arange(arr2.shape[0])[:,None],:, idxs]

输出:

array([[[ 1,  4,  7],
        [ 0,  3,  6],
        [ 2,  5,  8]],

       [[11, 14, 17],
        [10, 13, 16],
        [ 9, 12, 15]],

       [[18, 21, 24],
        [19, 22, 25],
        [20, 23, 26]],

       [[27, 30, 33],
        [29, 32, 35],
        [28, 31, 34]]])

【讨论】:

  • 非常感谢您的回答。但是,我想用它来对 arr2 进行排序。 arr2[np.arange(arr2.shape[0])[:, None], idxs] 交换行。 arr2[np.arange(arr2.shape[0])[:, None], idxs, :] 也不起作用。我当然可以以前使用交换轴,交换行,然后再交换轴。
  • 关于您的注释:我可以这样做来对 arr 进行排序,但我想使用这些索引对 arr2 进行排序。
  • 我试过了,但这没有用,是吗?第一个数组的列应该是 [1, 4, 7],但它是 [3, 0, 6]。
  • @Pickniclas 抱歉,粘贴了错误的输出。第一行确实是[1,4,7]。注意索引中额外的:。您在之前的评论中没有提到这一点
  • 谢谢,但仍然:arr2 的第一列是 [0, 3, 6],第二列是 [1, 4, 7],但在您的输出中,这些现在是行,而不是列,不是吗?
猜你喜欢
  • 1970-01-01
  • 2017-07-03
  • 1970-01-01
  • 2012-09-04
  • 2011-10-04
  • 2021-07-02
  • 2017-08-27
  • 1970-01-01
  • 2015-10-12
相关资源
最近更新 更多