图解Numpy花式索引及广播

花式索引

切片

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)

image.png

2.切片步长是2
image.png

3.最终结果:
image.png

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]]

解析:


image.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.逐个索引取数据


image.png

2.最终结果:


image.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.按照索引值定位子元素


image.png

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


image.png

3.最终结果:


image.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.按索引位逐个取值


image.png

2.最终结果:


image.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]]

解析:

image.png

广播的规则:
1.让所有输入数组都向其中形状最长的数组看齐,形状中不足的部分都通过在前面加 1 补齐。
2.输出数组的形状是输入数组形状的各个维度上的最大值。
3.如果输入数组的某个维度和输出数组的对应维度的长度相同或者其长度为 1 时,这个数组能够用来计算,否则出错。
4.当输入数组的某个维度的长度为 1 时,沿着此维度运算时都用此维度上的第一组值。
简单理解:
对两个数组,分别比较他们的每一个维度(若其中一个数组没有当前维度则忽略),满足:

1.数组拥有相同形状。
2.当前维度的值相等。
3.当前维度的值有一个是 1。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容