NumPy二维数组索引中[::-1][::-1]与[::-1, ::-1]的区别
NumPy二维数组两种反转索引写法的逻辑差异
复现代码
import numpy as np values = [ [5, 6, 5, 5, 8, 9, 9], [9, 5, 1, 4, 5, 9, 7], [3, 9, 6, 2, 1, 2, 3], [1, 7, 6, 7, 1, 7, 5], [2, 1, 3, 8, 7, 8, 8], [2, 9, 3, 6, 4, 6, 4] ] x = np.array(values) reverse_2d_1 = x[::-1][::-1] reverse_2d_2 = x[::-1, ::-1]
执行逻辑拆解
两种写法结果完全不同,核心区别是索引的作用维度和执行顺序完全不一样:
x[::-1][::-1]是两次链式的单维度索引
每次单独的[::-1]索引默认只操作数组的第一个维度(二维数组的行方向):- 第一次
x[::-1]会沿行方向反转整个数组,原数组最后一行移到第一行、倒数第二行移到第二行,生成一个行顺序完全颠倒的中间数组 - 第二次
[::-1]是对刚才生成的中间数组再次沿行方向反转,相当于把颠倒的行顺序又还原回初始状态
两次行反转效果完全抵消,最终输出和原数组完全一致。
- 第一次
x[::-1, ::-1]是NumPy支持的多维度同时索引
逗号分隔的切片参数会按顺序分别对应数组从低到高的维度,一次索引操作同时作用在多个维度上:- 第一个
::-1作用在第0维(行方向),反转所有行的顺序 - 第二个
::-1作用在第1维(列方向),反转每一行内部的元素顺序
最终效果是数组的行、列都被完全反转,等价于将二维数组旋转180度。
- 第一个
运行结果对照
reverse_2d_1输出(两次链式行反转):
[[5 6 5 5 8 9 9] [9 5 1 4 5 9 7] [3 9 6 2 1 2 3] [1 7 6 7 1 7 5] [2 1 3 8 7 8 8] [2 9 3 6 4 6 4]]
和原数组内容完全一致。
reverse_2d_2输出(双维度同时反转):
[[4 6 4 6 3 9 2] [8 8 7 8 3 1 2] [5 7 1 7 6 7 1] [3 2 1 2 6 9 3] [7 9 5 4 1 5 9] [9 9 8 5 5 6 5]]
为行列均反转后的结果。
常用反转操作参考:仅反转行用
x[::-1],仅反转列用x[:, ::-1],全维度反转用x[::-1, ::-1]。
内容的提问来源于stack exchange,提问作者MegaKarg
相关产品推荐
相关产品推荐

