基本切片:-
基本切片在使用slice对象时发生。通常切片对象构造为array[(start:stop:step)]。省略号和newaxis也属于此。 p>
示例:- 一维数组
>>x=np.arange(10)
>>x[2:10:3]
array([2, 5, 8])
示例:- 二维数组
>>>x = np.array([[1,2,3], [4,5,6]])
>>>x[1:2]
array([[4, 5, 6]])
示例:- 3D 数组
>>>x = np.array([[[1],[2],[3]], [[4],[5],[6]]])
>>> x[0:1]
array([[[1],
[2],
[3]]])
在上面的例子中,给定的 slices(obj) 的数量小于数组的总维数。 如果选择元组中的对象数量小于 N,则假定为任何后续维度。
高级切片:-
选择对象时触发高级索引,obj,
- 是一个非元组序列对象,
- 一个 ndarray(数据类型为整数或布尔值),
- 具有至少一个序列对象或 ndarray(数据类型为整数或布尔值)的元组。
有两种类型的高级索引:整数和布尔。
整数索引:-
整数数组索引允许根据它们的 N 维索引选择数组中的任意项。每个整数数组表示该维度的多个索引。
当索引由与被索引数组的维度一样多的整数数组组成时,索引是直截了当的,但不同于切片。
例子:-
>>a = np.array([[1,2,3],[4,5,6],[7,8,9]])
>>a[[0,1,2],[0,1,1]]
array([1, 5, 8])
上面的例子打印:
a[0,0],a[1,0],a[2,1]
记住:- 所以整数索引映射在两个索引之间。
现在回答你的问题:-
>>>a=np.array([3,4,5])
>>>a[0,:,[0,1]]
第一种情况:-
这是x[arr1,:,arr2]. 的形式
arr1 和 arr2 是高级索引。我们认为 0 也是高级索引。
如果高级索引由切片、省略号或 newaxis 分隔,则高级索引操作产生的维度在结果数组中首先出现,然后是子空间维度。
这实质上意味着 [0,1] 的维度在数组中排在第一位。我将离开 0,因为它没有维度。
>>>a[0,:,[0,1]].shape
(2,4)
第二种情况:-
这是x[:,:,arr1].的形式,这里只有arr1是高级索引。
如果高级索引都彼此相邻,则高级索引操作的维度将插入到结果数组中与初始数组中相同的位置。
这实质上意味着 [0,1] 的维度位于数组索引中指定的相应位置。
>>>a[0:1,:,[0,1]].shape
(1,4,2)
[0,1] 具有 shape(2,) 并且由于它出现在第三个索引处,因此它被插入到结果数组的第三个索引中。
欢迎提出任何建议和改进。
参考:-
- Numpy_Docs