Numpy矩阵索引等价性疑问:两种索引结果维度为何不同?
为什么NumPy两种索引返回的数组形状不同?
这其实是NumPy中两种索引机制的差异导致的,咱们把这两个操作拆开来看:
1. mat[:3,1:2] 的情况
这里的列索引用的是切片操作(1:2),在NumPy里,切片会保留原数组的维度信息。先看一下原数组:
import numpy as np mat = 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, 25]])
- 行切片
[:3]取前3行(索引0、1、2) - 列切片
1:2取索引1到2之间的列(不包含2,也就是只有索引1这一列)
因为切片操作不会降低数组维度,所以最终返回的是一个3行1列的二维数组,形状为(3, 1),结果就是:
array([[ 2], [ 7], [12]])
2. mat[:3,1] 的情况
这里的列索引用的是整数索引(单个整数1),当用单个整数索引获取某一行/列时,NumPy会自动进行降维操作——把原二维数组的对应维度“压缩”掉。
- 行切片
[:3]依然取前3行 - 列整数索引
1直接取每行的第2个元素(索引从0开始)
这三个元素会被组合成一个一维数组,形状为(3,),所以结果就是:
array([ 2, 7, 12])
额外小技巧
如果想用整数索引但又不想降维,你可以把整数放到列表里,比如mat[:3, [1]],这样返回的就是和切片操作一样的二维数组啦。
内容的提问来源于stack exchange,提问作者Uncle Iroh
相关产品推荐
相关产品推荐

