How to sort 2d numpy array by items in the inner array?

问题描述 投票:0回答:1

我有一个数组数组,我想根据其中第一个元素的值对这些内部数组进行排序,然后是第三个元素,最后是第二个元素。

我尝试在 np.sort 中指定顺序参数,但它给了我一个错误,因为这个数组不是结构化数组:

import numpy as np

arr = np.array([
    [1, 2, 3],
    [0, 2, 1],
    [1, 1, 2],
    [3, 2, 1],
    [1, 1, 0]
    ]
)
arr.sort(order=[0, 1, 2])
print(arr)

结果是:

Traceback (most recent call last):
  File     "/home/cg/root/6449d16512b77/main.py", line 11, in <module>
   
    arr = arr.sort(order=[0, 1, 2])
    ValueError: Cannot specify order when the array has no fields.

即使我尝试使用结构化数组,我也会得到不同的输出:

import numpy as np

arr = np.array([
    [1, 2, 3],
    [0, 2, 1],
    [1, 1, 2],
    [3, 2, 1],
    [1, 1, 0]
    ],
    dtype=[('a', int),
    ('b', int),
    ('c', int)
    ])

arr.sort(axis=1, order=['a', 'c', 'b'])
print(arr)

结果:

[[(1, 1, 1) (2, 2, 2) (3, 3, 3)]

 [(0, 0, 0) (1, 1, 1) (2, 2, 2)]

 [(1, 1, 1) (1, 1, 1) (2, 2, 2)]
 [(1, 1, 1) (2, 2, 2) (3, 3, 3)]
 [(0, 0, 0) (1, 1, 1) (1, 1, 1)]]

我希望输出是这样的:

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

如何在不使用结构化数组的情况下使用 numpy 执行此操作?

python arrays numpy sorting numpy-ndarray
1个回答
0
投票

您可以为此使用

np.lexsort
。请注意,传递给
lexsort
的参数必须以相反的顺序排列,即它首先按最后一个元素排序,然后是倒数第二个,依此类推。

import numpy as np

arr = np.array([[1, 2, 3], [0, 2, 1], [1, 1, 2], [3, 2, 1], [1, 1, 0]])

print(arr[np.lexsort((arr[:, 1], arr[:, 2], arr[:, 0]))])

输出:

[[0 2 1]
 [1 1 0]
 [1 1 2]
 [1 2 3]
 [3 2 1]]
© www.soinside.com 2019 - 2024. All rights reserved.