Python 为什么花式索引不同于numpy中的切片?
我一直在学习奇妙的索引,但当我观察到以下代码的行为时,我有几个问题 据我了解,Python 为什么花式索引不同于numpy中的切片?,python,arrays,numpy,indexing,Python,Arrays,Numpy,Indexing,我一直在学习奇妙的索引,但当我观察到以下代码的行为时,我有几个问题 据我了解, 花式索引是: 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],
花式索引是:
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
问题是: 为什么花式索引不能作为切片表示法返回?如何做到这一点
请开导我。
感谢根据定义,奇特的索引和切片表现不同 因此,与其质疑原因,不如:
- 能够识别/区分/区分它们(即,清楚地了解索引何时成为花式索引,何时是切片)
- 注意它们在语义(结果)上的差异
zip
函数“串联”组合两个输入序列的方式)。(用官方numpy
文档的话说,这两个索引数组“迭代在一起”)。我们正在传递列表[0,1]
用于索引轴0
上的数组,并传递列表[1,2]
用于索引轴1
上的数组。索引数组[0,1]
中的索引0
仅与索引数组[1,2]的对应的索引1
组合
。类似地,索引数组[0,1]
的索引1
仅与索引数组[1,2]的对应的索引2
组合
。换句话说,索引数组不会以多对多的方式相互组合。所有这些都是关于奇特的索引
在切片的情况下,为axis0
指定的切片:2
概念上为axis0
生成索引“0”和“1”;为axis1
指定的切片1:
概念上为axis1
生成索引2
与花式索引不同,它们以多对多的方式进行索引。因此,它们产生了四种组合,而不仅仅是两种组合
因此,花式索引和切片定义语义的关键区别在于,在花式索引的情况下,花式索引数组是迭代在一起的我不明白为什么您会期望相同的结果。
arr[[0,1],[1,2]]
返回一个包含两个元素的列表:第0行第1列的第一个元素,第1行和第2列的第二个元素。arr[:2,1::
返回一个包含第0-1行和第1-2列的二维子数组。这是预期和记录的行为:@ThomasSablik但当我执行arr[[0,1]]时~仅传递行列表意味着与arr[:2]相同因此,当与列组合时,它应该返回相同的结果!2**2
和2*2
和2+2
返回相同的结果。这是否意味着运算符**
、*
和+
总是要执行相同的操作?您发现了一种特殊情况,其中奇特的索引和切片返回相同的结果编程中最重要的规则之一是:不要期望任何东西。阅读文档。索引一维时,1:4和[1,2,3]选择相同的内容。但在2d中,一对列表与切片不同。请阅读完整的numpy索引文档。@ThomasSablik,我对您的解释感到满意,但问题是当我们“切片”时,我们被限制按顺序访问行或列。我的意思是arr[:3,2:]将按照0,1,2行和2,3列的顺序进行,无法从中间进行评估。要手动访问,我们会执行一种称为“花式索引”的操作。但作为其行为,我们不会获取整组行,而是获取它们相交的值。如果我要访问行=[0,2,1]和列=[1,0,2]要整行整列吗?谢谢你的回答。