区分numpy数组的基本和高级切片

时间:2016-07-04 14:38:19

标签: python arrays numpy

我正在阅读关于numpy array indexing的文档,但仍然不清楚如何区分基本和高级切片。

谢谢,如果有人能解释一下。

  

x[(1,2,3),]x[(1,2,3)]根本不同。后者是   相当于x[1,2,3],它将触发基本选择   前者将触发高级索引。一定要明白为什么这样   发生。

     

同时认识到x[[1,2,3]]将触发高级索引,而   x [[1,2,slice(None)]]`将触发基本切片。

1 个答案:

答案 0 :(得分:3)

从一个简单的1d数组开始:

In [326]: x=np.arange(10)

这两个表达式做同样的事情 - 从数组中选择3个元素。我还可以验证它们是否返回副本,而x[1:4]返回一个视图。

In [327]: x[(1,2,3),]
Out[327]: array([1, 2, 3])

In [328]: x[[1,2,3]]
Out[328]: array([1, 2, 3])

但是没有命令,元组会引发错误:

In [329]: x[(1,2,3)]
...
IndexError: too many indices for array

同样:

In [330]: x[1,2,3]
IndexError: too many indices for array
Python解释器将

x[1,2,3]转换为调用x.__getitem__((1,2,3))。也就是说,输入值作为元组传递给方法。 ()中的额外x[(1,2,3)]没有任何区别。但是第一个表达式中的逗号添加了一层嵌套:

In [338]: ((1,2,3))
Out[338]: (1, 2, 3)

In [339]: ((1,2,3),)
Out[339]: ((1, 2, 3),)

x[[1,2,slice(None)]]相当于x[1,2,:],但我必须制作一个3d数组来验证这一点。

In [344]: X=np.arange(64).reshape(4,4,4)

单个元素的3d索引:

In [345]: X[(1,2,3)]
Out[345]: 27

In [346]: X[1,2,3]
Out[346]: 27

3d,最后一维上有切片:

In [347]: X[1,2,:]
Out[347]: array([24, 25, 26, 27])

解释器只接受方括号括号中的:表示法:

In [348]: X[(1,2,:)]
...
SyntaxError: invalid syntax

但是使用slice,我们可以将其写为元组或列表

In [349]: X[(1,2,slice(None))]
Out[349]: array([24, 25, 26, 27])

In [350]: X[[1,2,slice(None)]]
Out[350]: array([24, 25, 26, 27])

元组在这里工作的原因与(1,2,3)相同。我认为它只是以同样的方式处理[]案例,因为这是唯一有意义的事情。将数字与切片组合以制作高级索引是没有意义的。

有一个索引技巧可以让我选择2个项目加一个切片:

In [354]: x[np.r_[1,3, 6:10]]
Out[354]: array([1, 3, 6, 7, 8, 9])

但实际上是将切片扩展到范围

In [353]: np.r_[1,3, 6:10]
Out[353]: array([1, 3, 6, 7, 8, 9])