我正在阅读关于numpy array indexing的文档,但仍然不清楚如何区分基本和高级切片。
谢谢,如果有人能解释一下。
x[(1,2,3),]
与x[(1,2,3)]
根本不同。后者是 相当于x[1,2,3]
,它将触发基本选择 前者将触发高级索引。一定要明白为什么这样 发生。同时认识到
x[[1,2,3]]
将触发高级索引,而 x [[1,2,slice(None)]]`将触发基本切片。
答案 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])