NumPy 的 ndarray 切片操作是一种灵活且强大的方式,用于获取数组的子数组,切片操作使得对数组的操作更加灵活和方便,可以方便地获取、处理和分析数组的不同部分,进行数据处理和分析。切片操作的基本语法是使用方括号 [] ,并指定起始索引、结束索引和步长(可选)。以下是切片操作的一些关键特点和示例:
1. 指定起始和结束索引:可以通过指定起始索引和结束索引来提取指定范围内的元素。
例如, arr[1:3] 会提取从索引 1 到索引 2(不包括索引 3)的元素。
2. 省略起始索引:省略起始索引表示从数组的开头开始提取。
例如, arr[:3] 会提取数组的前三个元素。
3. 省略结束索引:省略结束索引表示提取到数组的末尾。
例如, arr[1:] 会提取从索引 1 到数组末尾的所有元素。
4. 步长:可以通过指定步长来改变提取元素的间隔。
例如, arr[::2] 会每隔一个元素提取一个。
5. 负数索引:负数索引可以从数组的末尾开始计数。
例如, arr[-2:-1] 会提取数组的最后两个元素。
6. 灵活组合:可以根据需求组合使用上述方式来提取各种不同的子数组。
下面就让我们通过代码实例来加深理解:
# Python列表中的切片
l = [1,2,3,4,5,6,7,8,9]
print(l[2:6])
# 执行结果
[3, 4, 5, 6]
# 列表翻转
print(l[::-1])
# 执行结果
[9, 8, 7, 6, 5, 4, 3, 2, 1]
# NumPy数组
n = np.array(l)
n
# 执行结果
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
n[2:6],l[::-1]
# 执行结果
(array([3, 4, 5, 6]), [9, 8, 7, 6, 5, 4, 3, 2, 1])
# 二维或多维
n = np.random.randint(0,10,size=(6,8))
n
# 执行结果
array([[3, 1, 0, 5, 6, 1, 3, 9],
[2, 7, 2, 0, 6, 5, 0, 6],
[3, 7, 1, 6, 2, 4, 0, 3],
[9, 2, 2, 5, 6, 3, 4, 0],
[3, 5, 9, 3, 2, 3, 2, 9],
[4, 9, 6, 4, 6, 5, 4, 7]])
# 行,取一行
print(n[0])
# 执行结果
[3 1 0 5 6 1 3 9]
# 取连续的多行:切片
print(n[1:4])
# 执行结果
[[2 7 2 0 6 5 0 6]
[3 7 1 6 2 4 0 3]
[9 2 2 5 6 3 4 0]]
# 取指定多行:中括号
print(n[[1,2,4]])
# 执行结果
[[2 7 2 0 6 5 0 6]
[3 7 1 6 2 4 0 3]
[3 5 9 3 2 3 2 9]]
# 重复获取指定行
print(n[[1,4,2,2,3]])
# 执行结果
[[2 7 2 0 6 5 0 6]
[3 5 9 3 2 3 2 9]
[3 7 1 6 2 4 0 3]
[3 7 1 6 2 4 0 3]
[9 2 2 5 6 3 4 0]]
# 列,取一列
print(n[:,0]) # 取所有行,和第0列
# 执行结果
[3 2 3 9 3 4]
print(n[1:4,0])
# 执行结果
[2 3 9]
# 取连续的多列:切片
print(n[:,2:5])
# 执行结果
[[0 5 6]
[2 0 6]
[1 6 2]
[2 5 6]
[9 3 2]
[6 4 6]]
print(n[1:4,2:5])
# 执行结果
[[2 0 6]
[1 6 2]
[2 5 6]]
# 取不连续的多列:中括号
print(n[:,[1,3,4]])
# 执行结果
[[1 5 6]
[7 0 6]
[7 6 2]
[2 5 6]
[5 3 2]
[9 4 6]]
print(n[1:4,[1,3,4]])
# 执行结果
[[7 0 6]
[7 6 2]
[2 5 6]]