按元素排序多个numpy数组

时间:2018-06-17 08:38:29

标签: python arrays numpy multidimensional-array

假设我有3个数组(我知道事先的数组数),我想逐个元素地排序。例如,假设我有:

import numpy as np

x = np.array([
[100, 200, 300],
[400, 500, 600],
[700, 800, 900]
])

y = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
])

z = np.array([
[10, 20, 30],
[40, 50, 60],
[70, 80, 90]
])

我想得到每个元素的订单:

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

在这种情况下,所有位置都在相同的顺序上以保持示例简单(0> 2> 1),但实际上每个阵列上的每个元素可能比另一个阵列上的对应元素大。我也在使用更高维度的数组(3d而不是2d),但我认为总体思路是一样的。

我相信我需要重塑阵列,然后np.argsort它们(或者只是常规np.sort,我对价值更感兴趣而不是它们来自哪里,尽管如果有的话起源不高,可能有用了。)但我不确定如何重塑它们以便我可以应用该操作。所有阵列都保证具有相同的形状,尽管我的例子在这里,它仍然是偶数。

在我收到订单后,我不确定我所考虑的格式是否适合编制索引,但目前我无法找到更好的方法来对结果进行分组。我相信我可以稍后用answer[...,0]分隔最大索引(或最大值),第二个answer[...,1]等等。虽然如果我有索引,我必须稍后将它们映射到数组。我认为不应该那么难,我只需要np.stack他们在一起我相信。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

您可以使用dstack()将它们绑定在最后一个轴上,然后在预期的轴上使用np.sort()对数组进行排序:

In [10]: arr = np.dstack((x, y, z))

In [11]: arr.sort(2)

In [12]: arr
Out[12]: 
array([[[  1,  10, 100],
        [  2,  20, 200],
        [  3,  30, 300]],

       [[  4,  40, 400],
        [  5,  50, 500],
        [  6,  60, 600]],

       [[  7,  70, 700],
        [  8,  80, 800],
        [  9,  90, 900]]])

如果您希望结果按降序排列:

In [13]: arr[:,:,::-1]
Out[13]: 
array([[[100,  10,   1],
        [200,  20,   2],
        [300,  30,   3]],

       [[400,  40,   4],
        [500,  50,   5],
        [600,  60,   6]],

       [[700,  70,   7],
        [800,  80,   8],
        [900,  90,   9]]])