切片slice
在NumPy中,切片(slicing)是一种选择数组元素子集的方法。切片操作基于索引,但允许你指定一个范围的索引,而不是单个索引。这对于处理多维数组(NumPy中的ndarray对象)特别有用。
一维数组切片
假设你有一个一维NumPy数组
arr
,你可以使用冒号:
来指定切片的开始和结束索引(切片是左闭右开的,即包括开始索引但不包括结束索引)。
pythonimport numpy as np arr = np.array([1, 2, 3, 4, 5]) print(arr[1:4]) # 输出: [2 3 4]
在这个例子中,
arr[1:4]
选择了从索引1开始到索引4(不包括索引4)的元素。多维数组切片
对于多维数组,你可以在每个维度上分别指定切片。
pythonarr_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 选择第二行的所有元素 print(arr_2d[1, :]) # 输出: [4 5 6] # 选择所有行的前两列 print(arr_2d[:, :2]) # 输出: # [[1 2] # [4 5] # [7 8]] # 选择第一行和第二行的前两列 print(arr_2d[0:2, :2]) # 输出: # [[1 2] # [4 5]]
使用省略号(
...
)在NumPy中,省略号(
...
)用于表示选择所有前面的维度,这在处理多维数组时非常有用,特别是当你想要对数组的一部分进行切片,但保留前面的维度不变时。然而,需要注意的是,在NumPy中直接使用
...
进行切片的情况相对较少,因为它主要用于函数和方法的参数中,以指示"所有前面的维度"。但在某些情况下,你可以结合使用索引和省略号来实现特定的切片操作。不过,对于简单的切片任务,直接使用索引和冒号:
就足够了。示例:省略号的使用
假设你有一个三维数组,并想要选择所有第一维和第二维的元素,但只选择第三维的特定切片。
python
import torch
a = torch.Tensor([[
[1, 2, 3, 4, 67],
[4, 5, 6, 7, 45],
[7, 8, 9, 10, 56]
], [
[11, 2, 3, 4, 47],
[41, 5, 6, 7, 46],
[71, 8, 9, 10, 36]
]])
print(a.shape) # torch.Size([2, 3, 5])
c = a[..., 4]
print(c, c.shape)
# tensor([[67., 45., 56.],
# [47., 46., 36.]]) torch.Size([2, 3])
d = a[1, ...]
print(d, d.shape)
# tensor([[11., 2., 3., 4., 47.],
# [41., 5., 6., 7., 46.],
# [71., 8., 9., 10., 36.]]) torch.Size([3, 5])
c = a[..., 4] 表示保留前面所有维度,最后一个维度取第5个元素
d = a[1, ...] 表示第一个维度取第二个元素,保留后面的所有维度
双索引(高级索引)
在 NumPy 中,使用双索引(或称为高级索引)
probs[[0,1],[0,2]]
的方式会从二维数组probs
中选择特定的元素。具体来说,这种索引方式会按照第一个索引列表[0,1]
中的索引来选择行,同时按照第二个索引列表[0,2]
中的索引来选择列。假设
probs
是如下定义的二维数组:
pythonimport numpy as np probs = np.array([[0.6590012, 0.242433, 0.0985659], [0.32278368, 0.14503606, 0.5321803]])
那么,
probs[[0,1],[0,2]]
的结果将会是:
- 从第一行(索引为 0)选择第一列(索引为 0)的元素,即
0.6590012
- 从第二行(索引为 1)选择第三列(索引为 2)的元素,即
0.5321803
因此,
probs[[0,1],[0,2]]
的输出是:[0.6590012 0.5321803]
这是一个一维数组,包含了按照指定索引从
probs
中选择的两个元素。