You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2.8 KiB

2.1.5:索引与切片

索引

ndarray 的索引其实和 python 的 list 的索引极为相似。元素的索引从 0 开始。代码如下:

import numpy as np

# a中有4个元素那么这些元素的索引分别为0123
a = np.array([2, 15, 3, 7])

# 打印第2个元素
# 索引1表示的是a中的第2个元素
# 结果为15
print(a[1])

# b是个2行3列的二维数组
b = np.array([[1, 2, 3], [4, 5, 6]])

# 打印b中的第1行
# 总共就2行所以行的索引分别为01
# 结果为[1, 2, 3]
print(b[0])

# 打印b中的第2行第2列的元素
# 结果为5
print(b[1][1])

输出如下:

15
[1 2 3]
5

遍历

ndarray 的遍历方式与 python 的 list 的遍历方式也极为相似,示例代码如下:

import numpy as np

a = np.array([2, 15, 3, 7])

# 使用for循环将a中的元素取出来后打印
for element in a:
    print(element)

# 根据索引遍历a中的元素并打印
for idx in range(len(a)):
    print(a[idx])

# b是个2行3列的二维数组
b = np.array([[1, 2, 3], [4, 5, 6]])

# 将b展成一维数组后遍历并打印
for element in b.flat:
    print(element)

# 根据索引遍历b中的元素并打印
for i in range(len(b)):
    for j in range(len(b[0])):
        print(b[i][j])

输出如下:

2
15
3
7
2
15
3
7
1
2
3
4
5
6
1
2
3
4
5
6

切片

ndarray 的切片方式与 python 的 list 的遍历方式也极为相似,对切片不熟的同学也不用慌,套路很简单,就是用索引。

假设想要将下图中紫色部分切片出来,就需要确定行的范围和列的范围。由于紫色部分行的范围是 0 到 2 ,所以切片时行的索引范围是 0:3 (索引范围是左闭右开);又由于紫色部分列的范围也是 0 到 2 ,所以切片时列的索引范围也是 0:3 (索引范围是左闭右开)。最后把行和列的索引范围整合起来就是 [0:3, 0:3] (逗号左边是行的索引范围)。当然有时为了方便0 可以省略,也就是 [:3, :3] 。

切片示意图

切片示例代码如下:

import numpy as np

# a中有4个元素那么这些元素的索引分别为0123
a = np.array([2, 15, 3, 7])

'''
将索引从1开始到最后的所有元素切片出来并打印
结果为[15  3  7]
'''
print(a[1:])

'''
将从倒数第2个开始到最后的所有元素切片出来并打印
结果为[3  7]
'''
print(a[-2:])

'''
将所有元素倒序切片并打印
结果为[ 7  3 15  2]
'''
print(a[::-1])

# b是个2行3列的二维数组
b = np.array([[1, 2, 3], [4, 5, 6]])

'''
将第2行的第2列到第3列的所有元素切片并打印
结果为[[5 6]]
'''
print(b[1:, 1:3])

'''
将第2列到第3列的所有元素切片并打印
结果为[[2 3]
      [5 6]]
'''
print(b[:, 1:3])

输出如下:

[15 3 7]
[3 7]
[7 3 15 2]
[[5 6]]
[[2 3]
 [5 6]]