Numpy中二维索引方法的有效性

时间:2012-10-28 03:34:47

标签: arrays numpy

我在Numpy中看到过以两种不同方式索引的2D数组。假设我有一个数组A,我可以输入A[0:3, 2:5]A[0:3][:,2:5]。无论哪种方式,我得到相同的A片。

我很好奇为什么会选择一个而不是另一个。有速度差异吗?或者只是一个比另一个更Pythonic?

3 个答案:

答案 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]将为您提供超出范围错误的索引。