0%

NumPy数组之索引、切片

这里介绍如何对NumPy数组进行索引、切片

abstract.png

一维数组

对于一维数组而言,对其进行索引、切片、迭代。与Python列表的操作方式一样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import numpy as np

a = np.array([2,4,6,8])
print(a)
# 输出: [2 4 6 8]

# 索引
print(f"a[0] -->> {a[0]}")
# 输出: a[0] -->> 2
print(f"a[2] -->> {a[2]}")
# 输出: a[2] -->> 6

# 切片:与Python List的切片方式一样
print(f"a[0:2] --- {a[0:2]}")
# 输出: a[0:2] --- [2 4]
print(f"a[-3:] --- {a[-3:]}")
# 输出: a[-3:] --- [4 6 8]

# 迭代
for i in range( a.shape[0] ):
print(f"i: {i} >>> {a[i]}")
# 输出:
# i: 0 >>> 2
# i: 1 >>> 4
# i: 2 >>> 6
# i: 3 >>> 8

多维数组

多维数组的索引、切片、迭代方式如下所示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import numpy as np

a = np.arange(24).reshape(4,6)
print(a)
# 输出:
# [[ 0 1 2 3 4 5]
# [ 6 7 8 9 10 11]
# [12 13 14 15 16 17]
# [18 19 20 21 22 23]]

# 索引: 用以逗号分隔的元组形式指定各轴的索引
print(f"a[0,3] -->> {a[0,3]}")
# 输出: a[0,3] -->> 3
print(f"a[1,3] -->> {a[1,3]}")
# 输出: a[1,3] -->> 9
print(f"a[2,-3] -->> {a[2,-3]}")
# 输出: a[2,-3] -->> 15

# 切片: 用以逗号分隔的元组形式指定各轴的切片
print(a[0:3, 1:4])
# 输出:
# [[ 1 2 3]
# [ 7 8 9]
# [13 14 15]]
print(a[1:2, 2:3])
# 输出: [[8]]

# 迭代

# 多维数组迭代:以第一个轴进行迭代
for i in a:
print(f"i : {i}")
# 输出:
# i : [0 1 2 3 4 5]
# i : [ 6 7 8 9 10 11]
# i : [12 13 14 15 16 17]
# i : [18 19 20 21 22 23]

# 多维数组迭代:flat属性会返回该数组所有元素的迭代器。实现以一维的方式迭代多维数组的所有元素
for j in a.flat:
print(j, end=", ")
# 输出: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,

当某个轴的切片期望取该轴的全部数据,即完整切片。可使用 :冒号 来表示。特别地:当指定的切片少于轴的数量,则缺失的切片被视为完整切片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import numpy as np

a = np.arange(24).reshape(4,6)
print(a)
# 输出:
# [[ 0 1 2 3 4 5]
# [ 6 7 8 9 10 11]
# [12 13 14 15 16 17]
# [18 19 20 21 22 23]]

# 某个轴的切片使用:意为完整切片(取该轴的全部数据)
# 故其与 print(a[1:3, 0:6]) 效果一样
print(a[1:3, :])
# [[ 6 7 8 9 10 11]
# [12 13 14 15 16 17]]

# 某个轴的切片使用:意为完整切片(取该轴的全部数据)
# 故其与 print(a[0:4, 2:5]) 效果一样
print(a[:,2:5])
# [[ 2 3 4]
# [ 8 9 10]
# [14 15 16]
# [20 21 22]]

# 特别地:当指定的切片少于轴的数量,则缺失的切片被视为完整切片
# 故其与 print(a[3:5, :]) 、 print(a[3:5, 0:6]) 效果一样
print(a[3:5])
# 输出: [[18 19 20 21 22 23]]

此外在指定切片时,还可以使用 …省略号 来表示缺失的 全部:冒号 。显然,省略号在指定切片时只能使用一次

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import numpy as np

x = np.arange(16).reshape(2,2,2,2)
print(x)
# 输出:
# [[[[ 0 1]
# [ 2 3]]
#
# [[ 4 5]
# [ 6 7]]]
#
#
# [[[ 8 9]
# [10 11]]
#
# [[12 13]
# [14 15]]]]


# 相当于: print(x[0,1,:,:])
print(x[0,1,...])
# 输出:
# [[4 5]
# [6 7]]

# 相当于: print(x[:,:,:,0])
print(x[...,0])
# 输出:
# [[[ 0 2]
# [ 4 6]]
#
# [[ 8 10]
# [12 14]]]

# 相当于: print(x[:,0,:,0])
print(x[...,0,:,0])
# 输出:
# [[ 0 2]
# [ 8 10]]

索引数组

索引时,可以使用索引数组(索引值组成的数组)来获取多个元素

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import numpy as np

square_nums = np.arange(9) ** 2
print(square_nums)
# 输出: [ 0 1 4 9 16 25 36 49 64]

# 支持Python数组格式的索引数组
index1 = [3,1,7,2,1]
print(square_nums[index1])
# 输出: [ 9 1 49 4 1]

# 支持NumPy数组格式的索引数组
index2= np.array([3,1,7,2,1])
print(square_nums[index2])
# 输出: [ 9 1 49 4 1]

当被索引数组为多维数组时,可通过 由多个索引数组组成的元组 来实现依次为各维度指定索引。此时要求各维度的索引数组形状必须相同

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import numpy as np

a = np.arange(12).reshape(4,3)
print(a)
# 输出:
# [[ 0 1 2]
# [ 3 4 5]
# [ 6 7 8]
# [ 9 10 11]]

# 如果索引数组只有一个时,则其指的是被索引数组的第一维
rowIndex = np.array( [[0,2],[1,3]] )
print(rowIndex)
# 输出:
# [[0 2]
# [1 3]]
print(a[rowIndex])
# 输出:
# [[[ 0 1 2]
# [ 6 7 8]]
#
# [[ 3 4 5]
# [ 9 10 11]]]

# 可通过 由多个索引数组组成的元组 来实现依次为各维度指定索引。此时要求各维度的索引数组形状必须相同
colIndex = np.array([[0,0],[1,2]])
print(colIndex)
# 输出:
# [[0 0]
# [1 2]]
print(a[rowIndex, colIndex])
# 输出:
# [[ 0 6]
# [ 4 11]]

布尔索引

布尔数组形状 与 被索引数组形状 一致

NumPy当中支持使用具有相同形状的布尔数组作为索引。其中:True值表示选择相应位置处的元素;False值表示不选择相应位置处的元素。最终结果会将选择的元素展平为一维数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import numpy as np

num = np.array(
[
[13,-9,12],
[-37,-92,22]
]
)
print(num)
# 输出:
# [[ 13 -9 12]
# [-37 -92 22]]

# 创建布尔数组
positive_index = num > 0
print(positive_index)
# 输出:
# [[ True False True]
# [False False True]]

positive_num = num[positive_index]
print(positive_num)
# 输出: [13 12 22]

布尔索引用于赋值操作时,会将布尔数组中True值相应位置处的元素赋值为指定值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import numpy as np

num = np.array(
[
[13,-9,12],
[-37,-92,22]
]
)
print(num)
# 输出:
# [[ 13 -9 12]
# [-37 -92 22]]

# 创建布尔数组
negative_index = num < 0
print(negative_index)
# 输出:
# [[False True False]
# [ True True False]]

num[negative_index] = 996
print(num)
# 输出:
# [[ 13 996 12]
# [996 996 22]]

一维布尔数组 索引 指定维度

一维的布尔数组 可以作为被索引数组的某个维度的索引,显然需要保证 该一维布尔数组的长度 与 被索引数组在指定维度上的长度 完全一样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import numpy as np

arr = np.array(
[
[1, 2],
[3, 4],
[5, 6]
]
)

b1 = np.array([True, False, True])
r1 = arr[b1,:]

# 等效于 [b1,:]
r2 = arr[b1]

print(r1)
# 输出:
# [[1 2]
# [5 6]]
print(r2)
# 输出:
# [[1 2]
# [5 6]]

b3 = np.array([True, False])
r3 = arr[:, b3]
print(r3)
# 输出:
# [[1]
# [3]
# [5]]
请我喝杯咖啡捏~

欢迎关注我的微信公众号:青灯抽丝