基本切片:-
当使用slice对象时,会发生基本切片。通常,切片对象构造为array[(start:stop:step)]。省略号和newaxis也属于此类。
例子:1D数组
>>x=np.arange(10)
>>x[2:10:3]
array([2, 5, 8])
例子:2D数组
>>>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]]])
在上面的例子中,给定的切片数量(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])
![Array Visualization](https://istack.dev59.com/vxMGI.webp)
上面的示例输出:
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也是高级索引。
如果高级索引由切片、省略号或新轴分隔,则高级索引操作产生的维度首先出现在结果数组中,然后是子空间维度。
这意味着[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] 的形状为 (2,),由于它出现在第三个索引位置,因此插入到结果数组的第三个索引位置。
欢迎提出任何建议和改进意见。
参考资料:
- Numpy_Docs
a[0]
和a[0:1]
之间的区别,你就能理解了。前者返回一个形状为**()的结果,而后者返回一个形状为(1,)的结果,对于1D**列表来说。 - Justice_Lords