NumPy索引/切片行为解析求助
NumPy索引/切片行为解析求助
嘿,我来帮你把这些NumPy索引的门道掰扯清楚~
首先先解决你最困惑的第一个问题:为什么#1是一维数组,而#2、#3、#4都是形状为(1,4)的二维数组?核心区别就在整数索引和列表索引的行为差异:
核心规则:索引方式对维度的影响
- 单个整数索引(比如
2而不是[2]):会直接消除对应的维度。比如原数组是(3,4,5)的三维数组,用整数2选第一个维度的元素时,相当于把第一个维度“剥掉”,剩下的维度是(4,5);再用整数4选第三个维度的元素,又剥掉第三个维度,最后就剩下中间的4,也就是形状为(4,)的一维数组——这就是#1的结果。 - 单元素列表索引(比如
[2]):哪怕列表里只有一个元素,也会保留对应的维度,只是维度长度变成列表的长度(这里是1)。比如:- #2里的
[[2], :, 4]:第一个维度用列表索引[2]保留了长度为1的维度,第三个维度用整数索引4剥掉了维度,最后剩下(1,4)的二维数组; - 至于#3,理论上
arr[2, :, [4]]的形状应该是(4,1)(第一个维度剥掉,第三个维度保留长度1的维度),不过看你给出的输出可能是笔误,但核心逻辑不变:只要用了列表索引,不管里面元素多少,对应维度都会被保留。 - #4则是两个维度都用了单元素列表索引,两个维度都被保留,所以结果还是
(1,4)的二维数组。
- #2里的
简单来说:只要你用[]把索引包成列表(哪怕只有一个元素),NumPy就会认为你是在“选择一组元素”,所以会保留这个维度;而直接用单个整数,就是“选择一个具体的块”,会把这个维度去掉。
再看那个更复杂的例子
对于arr[[1,3], :3, [4,2]],这是NumPy里的广播式花式索引,规则是:当多个维度用列表索引时,NumPy会自动把这些索引广播成匹配的形状,然后对应位置的元素组合起来。
我们拆解一下:
- 原数组是
(4,6,5),第一个维度选[1,3](长度2),第二个维度选:3(前3个元素,长度3),第三个维度选[4,2](长度2); - 这里第一个维度的
[1,3]和第三个维度的[4,2]是一一对应的:第一个维度的第1个元素(1)对应第三个维度的第1个元素(4),第一个维度的第2个元素(3)对应第三个维度的第2个元素(2); - 然后第二个维度的
:3是对每一组(i,k)都取所有j=0,1,2的元素,所以就得到了2行(对应i=1和i=3)3列(对应j=0,1,2)的结果,也就是你看到的(2,3)数组。
总结一下:
- 整数索引降维,列表索引保维;
- 多维度用列表索引时,会触发广播匹配,把不同长度的索引组合成合理的形状。
备注:内容来源于stack exchange,提问作者ThxAlot




