我有一个数组数组,我想根据其中第一个元素的值对这些内部数组进行排序,然后是第三个元素,最后是第二个元素。
我尝试在 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 执行此操作?
您可以为此使用
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]]