首页 > 解决方案 > 使用 numpy.argsort 对 3D numpy 数组进行排序会产生令人费解的结果

问题描述

假设我有以下数组:

x = array([[[2, 5],
            [6, 7]],

           [[8, 1],
            [4, 9]]])

我想对每个子数组的第一列进行排序以获得以下结果:

out = array([[[2, 5],
              [6, 7]],

             [[4, 9],
              [8, 1]]])

因此,当运行以下代码时:

x[:,x[:,:,0].argsort()]

结果是:

out1 = array([[[[2, 5],
                [6, 7]],

               [[6, 7],
                [2, 5]]],

              [[[8, 1],
                [4, 9]],

               [[4, 9],
                [8, 1]]]])

事实证明,我想要的结果在这个 2x2 矩阵的对角线上,所以我仍然可以获得我想要的结果,但我不明白非对角线是什么。看起来它们甚至没有以任何方式排序。

非对角线阵列从何而来?

另外,我怎样才能得到我想要的结果而不必经过这个相当大且无用的数组(out1)?

标签: pythonarraysnumpymultidimensional-array

解决方案


您需要使用高级索引而不是使用切片:

x[np.arange(len(x))[:,None], x[...,0].argsort()]

#[[[2 5]
#  [6 7]]

# [[4 9]
#  [8 1]]]

推荐阅读