1

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

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

4

3 回答 3

2

第一种形式更 Pythonic 和可取,因为它执行一个切片操作。第二种形式实际上切片两次。

在第一种形式中,A[0:3]返回一个小于 A 的切片,然后第二个切片操作将第一个切片的结果切片。

于 2012-10-28T03:40:45.360 回答
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) 在此临时数组上获取切片。这通常比第一种方法(直接切片)效率低,因此不推荐。【你指的链接好久没更新了,应该是bug……】

于 2012-10-29T10:41:36.197 回答
1

我认为使用A[i,j]样式而不是A[i][j]样式的一个很好的理由是,它可以在切片时轻松寻址整行或整列。

例如,A[:,0]将返回第 0 列中的所有值,而A[:][0]会给您一个索引超出范围错误。

于 2014-09-04T11:29:05.213 回答