如何对4D NumPy数组的第三维度执行降序排序?
解决NumPy 4D数组沿指定维度降序排序的问题
问题背景
现有一个4D NumPy数组:
import numpy as np Y = np.random.randint(1, 9, size=(5,1,10,4)) print(Y.shape) # 输出 (5, 1, 10, 4)
数组前2个元素示例:
# Y的前2个元素 Y[:2] array([[[[1, 8, 7, 8], [8, 2, 7, 3], [7, 8, 7, 8], [3, 1, 8, 4], [3, 1, 2, 2], [6, 4, 2, 3], [3, 8, 1, 8], [1, 7, 3, 2], [7, 4, 6, 6], [1, 5, 6, 3]]], [[[7, 2, 7, 7], [4, 8, 5, 5], [1, 2, 7, 5], [7, 5, 8, 3], [6, 4, 2, 4], [4, 4, 2, 4], [1, 5, 3, 7], [4, 5, 3, 3], [4, 8, 2, 2], [6, 1, 6, 6]]]])
需求是沿**第三维度(axis=2)**对数组进行降序排序,但直接使用numpy.ndarray.sort()时出现错误:
Y_sorted_reversed = Y.sort(Y, axis=2) # 报错:TypeError: argument for sort() given by name ('axis') and position (position 0)
同时ndarray.sort()没有reversed参数直接实现逆序排序。
错误原因
numpy.ndarray.sort()是原地排序方法,调用时不需要传入数组本身作为参数,正确的调用形式是Y.sort(axis=2),但该方法默认仅支持升序排序,无法直接指定降序。
正确解决方案
以下两种方法均可实现沿axis=2的降序排序:
方法1:np.sort()升序排序后反转维度
np.sort()会返回排序后的新数组(非原地修改),先沿axis=2升序排序,再反转该维度得到降序结果:
Y_sorted_reversed = np.sort(Y, axis=2)[:, :, ::-1, :]
方法2:负号转换实现降序(更高效)
对数组取负后执行升序排序,再取负恢复原数值,等价于原数组降序排序:
Y_sorted_reversed = -np.sort(-Y, axis=2)
原地排序的实现方式
如果需要原地修改数组,可先复制原数组,再执行原地升序排序后反转维度:
Y_copy = Y.copy() Y_copy.sort(axis=2) Y_sorted_reversed = Y_copy[:, :, ::-1, :]
验证结果
排序后的数组前2个元素符合预期:
# Y_sorted_reversed的前2个元素 Y_sorted_reversed[:2] array([[[[8, 8, 8, 8], [7, 8, 7, 8], [7, 8, 7, 8], [6, 7, 7, 6], [3, 5, 6, 4], [3, 4, 6, 3], [3, 4, 3, 3], [1, 2, 2, 3], [1, 1, 2, 2], [1, 1, 1, 2]]], [[[7, 8, 8, 7], [7, 8, 7, 7], [6, 5, 7, 6], [6, 5, 6, 5], [4, 5, 5, 5], [4, 4, 3, 4], [4, 4, 3, 4], [4, 2, 2, 3], [1, 2, 2, 3], [1, 1, 2, 2]]]])
内容的提问来源于stack exchange,提问作者Amina Umar
相关产品推荐
相关产品推荐

