我试图对3D阵列进行排序并且收效甚微。我已经阅读了有关如何针对两个维度完成此操作的各种方法,但我似乎无法将其扩展。
我有一个像:
这样的数组[[[0, 25], [1, 20], [2, 80], [0, 0], [0, 0], [0, 0]],
[[0, 80], [0, 20], [1, 25], [1, 40], [2, 99], [0, 0]],
[[0, 99], [1, 40], [2, 80], [0, 0], [0, 0], [0, 0]]]
我希望按第二个值的总和对其进行排序。 我用来订购的标准是第二个值的总和。 E.g:
25+20+80 = 125
80+20+25+40+99 = 264
99+40+80 = 219
所以:
[[[0, 80], [0, 20], [1, 25], [1, 40], [2, 99], [0, 0]],
[[0, 99], [1, 40], [2, 80], [0, 0], [0, 0], [0, 0]]],
[[0, 25], [1, 20], [2, 80], [0, 0], [0, 0], [0, 0]]]
有人可以帮助我吗?
答案 0 :(得分:2)
我想我明白你需要什么。假设您的数组存储在a
中。
>>> a
Out[19]:
array([[[ 0, 25],
[ 1, 20],
[ 2, 80],
[ 0, 0],
[ 0, 0],
[ 0, 0]],
[[ 0, 80],
[ 0, 20],
[ 1, 25],
[ 1, 40],
[ 2, 99],
[ 0, 0]],
[[ 0, 99],
[ 1, 40],
[ 2, 80],
[ 0, 0],
[ 0, 0],
[ 0, 0]]])
a[:, :, 1]
访问最里面维度的第二个元素,因此您可以对此进行求和(在水平轴上,即轴= 1)以获得排序所需的值:
>>> a[:, :, 1]
Out[20]:
array([[25, 20, 80, 0, 0, 0],
[80, 20, 25, 40, 99, 0],
[99, 40, 80, 0, 0, 0]])
>>> b = np.sum(a[:, :, 1], axis=1)
>>> b
Out[21]: array([125, 264, 219])
使用np.argsort
获取已排序的索引,而不是排序的数组:
>>> i = np.argsort(b)[::-1] # Reverse the array for descending order
>>> i
Out[23]: array([1, 2, 0])
最后,根据需要使用索引访问数组:
>>> a[i, :, :]
Out[25]:
array([[[ 0, 80],
[ 0, 20],
[ 1, 25],
[ 1, 40],
[ 2, 99],
[ 0, 0]],
[[ 0, 99],
[ 1, 40],
[ 2, 80],
[ 0, 0],
[ 0, 0],
[ 0, 0]],
[[ 0, 25],
[ 1, 20],
[ 2, 80],
[ 0, 0],
[ 0, 0],
[ 0, 0]]])
希望这有帮助!