图解Numpy花式索引

179 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情

花式索引

切片

import numpy as np
# 切片
a = np.arange(10)
print("a:{}".format(a))
print("a[2:7:2]结果:{}".format(a[2:7:2]))

结果:

a:[0 1 2 3 4 5 6 7 8 9]
a[2:7:2]结果:[2 4 6]

解析:

1.索引范围是2到7(不包含7)

QQ20220615-0.png

2.切片步长是2

7BE2E5A98620E52B5E3FAF38F29EF771.jpg 3.最终结果:

41C3708A4FA4BA2A95E9BBC4113D8AB1.jpg

import numpy as np
# 切片
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
b = a[1:3, 0:2]
print("a:{}".format(a))
print("b:{}".format(b))

结果:

a:[[1 2 3]
 [4 5 6]
 [7 8 9]]
b:[[4 5]
 [7 8]]

解析:

4692499-e7773f69698ad3a9.png

索引

import numpy as np
# 索引
a = np.arange(10, 20)
print("a:{}".format(a))
print("a[[1, 3, 6, 8]]结果:{}".format(a[[1, 3, 6, 8]]))

结果:

a:[10 11 12 13 14 15 16 17 18 19]
a[[1, 3, 6, 8]]结果:[11 13 16 18]

解析: 1.逐个索引取数据

4692499-70935922b5419626.png

2.最终结果:

4692499-9b6fd4f74150816c.png

高级索引

import numpy as np
# 高级索引
x = np.array([[1, 2], [3, 4], [5, 6]])
y = x[[0, 2, 0], [0, 1, 1]]
print("x:{}".format(x))
print("y:{}".format(y))

结果:

x:[[1 2]
 [3 4]
 [5 6]]
y:[1 6 2]

解析:

1.按照索引值定位子元素

4692499-a3d126ee1bccacc1.png

2.在上一步的基础上进一步定位

4692499-785eea9423fd81fd.png

3.最终结果:

4692499-0f576b59409cca75.png

import numpy as np
# 高级索引
x = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]])
print('我们的数组x:')
print(x)
print('\n')
rows = [[0, 0], [3, 3]]
cols = [[0, 2], [0, 2]]
y = x[rows, cols]
print('这个数组的四个角元素是:')
print(y)

结果:

我们的数组x:
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]


这个数组的四个角元素是:
[[ 0  2]
 [ 9 11]]

1.按索引位逐个取值

4692499-8e2fe2e201185579.png

2.最终结果:

4692499-15c47b1fde5871e7.png

广播

import numpy as np
#广播
a = np.array([[0, 0, 0],
              [10, 10, 10],
              [20, 20, 20],
              [30, 30, 30]])
b = np.array([1, 2, 3])
print(a + b)

结果:

[[ 1  2  3]
 [11 12 13]
 [21 22 23]
 [31 32 33]]

解析:

4692499-b2bd753d8d70f340.png

广播的规则:

1.让所有输入数组都向其中形状最长的数组看齐,形状中不足的部分都通过在前面加 1 补齐。

2.输出数组的形状是输入数组形状的各个维度上的最大值。

3.如果输入数组的某个维度和输出数组的对应维度的长度相同或者其长度为 1 时,这个数组能够用来计算,否则出错。

4.当输入数组的某个维度的长度为 1 时,沿着此维度运算时都用此维度上的第一组值。

简单理解:

对两个数组,分别比较他们的每一个维度(若其中一个数组没有当前维度则忽略),满足:

1.数组拥有相同形状。

2.当前维度的值相等。

3.当前维度的值有一个是 1。