【发布时间】: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