我在Numpy中看到过以两种不同方式索引的2D数组。假设我有一个数组A
,我可以输入A[0:3, 2:5]
或A[0:3][:,2:5]
。无论哪种方式,我得到相同的A片。
我很好奇为什么会选择一个而不是另一个。有速度差异吗?或者只是一个比另一个更Pythonic?
答案 0 :(得分:2)
第一种形式是更加pythonic和欲望,因为它执行一个切片操作。第二种形式实际上是两次切片。
在第一种形式中,A[0:3]
返回一个小于A的切片,然后第二个切片操作将第一个切片的结果切片。
答案 1 :(得分:1)
执行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)对此临时数组进行切片。这通常比第一种方法(直接切片)效率低,因此不推荐使用。 [您所指的链接暂时没有更新,可能是个错误...]
答案 2 :(得分:1)
我认为使用A[i,j]
样式优于A[i][j]
样式的一个很好的理由是它允许在切片时轻松寻址整个行或列。
例如,A[:,0]
将返回第0列中的所有值,而A[:][0]
将为您提供超出范围错误的索引。