You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

NumPy索引/切片行为解析求助

NumPy索引/切片行为解析求助

嘿,我来帮你把这些NumPy索引的门道掰扯清楚~

首先先解决你最困惑的第一个问题:为什么#1是一维数组,而#2、#3、#4都是形状为(1,4)的二维数组?核心区别就在整数索引列表索引的行为差异:

核心规则:索引方式对维度的影响

  1. 单个整数索引(比如2而不是[2]:会直接消除对应的维度。比如原数组是(3,4,5)的三维数组,用整数2选第一个维度的元素时,相当于把第一个维度“剥掉”,剩下的维度是(4,5);再用整数4选第三个维度的元素,又剥掉第三个维度,最后就剩下中间的4,也就是形状为(4,)的一维数组——这就是#1的结果。
  2. 单元素列表索引(比如[2]:哪怕列表里只有一个元素,也会保留对应的维度,只是维度长度变成列表的长度(这里是1)。比如:
    • #2里的[[2], :, 4]:第一个维度用列表索引[2]保留了长度为1的维度,第三个维度用整数索引4剥掉了维度,最后剩下(1,4)的二维数组;
    • 至于#3,理论上arr[2, :, [4]]的形状应该是(4,1)(第一个维度剥掉,第三个维度保留长度1的维度),不过看你给出的输出可能是笔误,但核心逻辑不变:只要用了列表索引,不管里面元素多少,对应维度都会被保留。
    • #4则是两个维度都用了单元素列表索引,两个维度都被保留,所以结果还是(1,4)的二维数组。

简单来说:只要你用[]把索引包成列表(哪怕只有一个元素),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

火山引擎 最新活动