如何调整NumPy 3D数组的行顺序以得到指定的重排结果?
实现方案
你这个场景不需要使用.argsort()方法,该方法的作用是基于数组元素值计算排序后的索引位置,适合需要按元素值大小动态排序的场景。你当前的需求是将每个二维子块的行顺序整体反转,直接用NumPy原生切片实现即可,代码更简洁、运行效率更高。
首先注意你原示例代码有个拼写错误:import numpy an np里的an应该改成as,否则运行会报错。
完整实现代码如下:
import numpy as np arr3D = np.array([[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]], [[13, 14, 15], [16, 17, 18], [19, 20, 21], [22, 23, 24]]]) # 沿行轴做逆序切片 res = arr3D[:, ::-1, :]
打印res就能得到你预期的结果:
[[[10 11 12] [ 7 8 9] [ 4 5 6] [ 1 2 3]] [[22 23 24] [19 20 21] [16 17 18] [13 14 15]]]
切片逻辑说明
NumPy多维数组切片是按维度顺序指定规则的,三个维度的切片规则分别是:
- 第一个维度(最外层的2个二维块):用
:选中所有元素,不做顺序调整 - 第二个维度(每个二维块内的行):用
::-1表示沿该轴从后往前取元素,也就是反转行顺序 - 第三个维度(每行内的列元素):用
:选中所有元素,不调整列顺序
这种切片操作是视图级别的,不会额外拷贝数组数据,性能远高于基于排序API实现的方案。如果后续你遇到需要根据某行/某列的数值大小动态排序行的场景,再考虑使用.argsort()即可。
内容的提问来源于stack exchange,提问作者pymn
相关产品推荐
相关产品推荐

