我在 Numpy 中看到了以两种不同方式索引的二维数组。假设我有一个数组A
,我可以输入A[0:3, 2:5]
或A[0:3][:,2:5]
。无论哪种方式,我都会得到相同的 A 片。
我很好奇为什么一个人会选择一个而不是另一个。有速度差异吗?还是一个比另一个更Pythonic?
第一种形式更 Pythonic 和可取,因为它执行一个切片操作。第二种形式实际上切片两次。
在第一种形式中,A[0:3]
返回一个小于 A 的切片,然后第二个切片操作将第一个切片的结果切片。
当你这样做时A[0:3,2:5]
,你实际上是在做
A.__getitem__((slice(0,3),slice(2,5)))
换句话说,您__getitem__
只调用该方法一次
当你这样做时A[0:3][:,2:5]
,你实际上是在做
A.__getitem__(slice(0,3)).__getitem__((slice(0,None), slice(2,5)))
换句话说,您正在 (i) 创建一个临时数组A[0:3]
并 (ii) 在此临时数组上获取切片。这通常比第一种方法(直接切片)效率低,因此不推荐。【你指的链接好久没更新了,应该是bug……】
我认为使用A[i,j]
样式而不是A[i][j]
样式的一个很好的理由是,它可以在切片时轻松寻址整行或整列。
例如,A[:,0]
将返回第 0 列中的所有值,而A[:][0]
会给您一个索引超出范围错误。