我一直在学习花哨的索引,但是当我观察以下代码的行为时,我遇到了几个问题......
据我了解,
花式索引是:
ndArray[ [0,1,2] ]
即传递行/列列表
和
切片是:
ndArray[ 0:3 ]
即给出一系列行/列
现在,问题
一个 numpy 数组,
arr = [ [1,2,3],
[4,5,6],
[7,8,9] ]
当我尝试花式索引时:
arr[ [0,1], [1,2] ]
>>> [2, 6]
切片时,
arr[:2, 1:]
>>> [ [2, 3],
[5, 6] ]
本质上,它们都应该返回二维数组,因为它们的含义相同,因为它们可以互换使用!
:2 should be equivalent to [0,1] #For rows
1: should be equivalent to [1,2] #For cols
The question: Why Fancy indexing is not returning as the slice notation? And how to achieve that?
请赐教。 谢谢
最佳答案
花哨的索引和切片的行为根据定义/根据numpy
规范不同。
因此,与其质疑为什么会这样,不如:
能够识别/区分/区分它们(即清楚地了解索引何时成为花式索引,以及何时进行切片)。
注意它们语义(结果)的差异。
在您的示例中:
在花式索引的情况下,为两个轴生成的索引“串联”组合(类似于 zip
函数“串联”组合两个输入序列。(换句话说)根据官方 numpy
文档,两个索引数组“一起迭代”)。我们传递列表 [0, 1]
用于在轴 上索引数组0
,并传递列表[1, 2]
用于在轴1
上索引数组。索引中的索引0
数组[0, 1]
仅与索引数组[的相应索引
。同样,索引数组 1
组合1, 2][0, 1]
的索引 1
仅与 组合索引数组[1, 2]
的strong>对应索引2
。换句话说,索引数组不组合以多对多的方式相互关联。所有这一切都与花哨的索引有关。
在切片的情况下,为轴0
指定的切片:2
概念上为轴0<生成索引“0”和“1”/
;为轴 1
指定的切片 1:
在概念上为轴 1< 生成索引
。但这些生成的索引以多对多方式组合,这与花式索引的情况不同。因此,它们产生四种组合,而不仅仅是两种。1
和 2
/
因此,花式索引和切片定义的语义之间的关键区别在于,在花式索引的情况下,花式索引数组一起迭代。
关于python - 为什么花式索引与 numpy 中的切片不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65680319/