假设我有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
他们在一起我相信。
有什么建议吗?
答案 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]]])