2.广播机制
🚩所谓广播,就是对原本数据的不断复制,复制到和目标数组相同的构造的时候,比如我们有一个三行四列的数组,要加一行四列的数组,那么一行四列的数组就会自己复制三份,变成三行四列的数组,其中每一行都和原本数组的值相同,变成这种形式之后,再和原三行四列的数组进行相加运算,下面,我们从三个方面进行代码演示:一维数组的广播,二维数组的广播,三维数组的广播。
2.1 一维数组的广播
arr1 = np.random.randint(0, 10, size = (5, 3)) arr2 = np.arange(1, 4) display(arr1, arr2) # arr1 有五行,arr2 只有一行 # 它们俩的相加就是通过广播机制 # 广播机制:arr2 变身,变成了五份(一模一样) # 每一份对应每一行的相加 arr1 + arr2
2.2 二维数组的广播
arr3 = np.random.randint(0, 10, size = (4, 5)) # 计算每一行的平均值 arr4 = arr3.mean(axis = 1) display(arr3, arr4) # 注意 arr3 每一行5个数,arr4一行中为4个数 arr3 - arr4 # 形状不匹配,所以报错
因为形状不匹配的原因,故会报错,我们可以使用 2.1.1 数组变形 中的 reshape() 方法,对数组进行更改:
arr3 = np.random.randint(0, 10, size = (4, 5)) # 计算每一行的平均值 arr4 = arr3.mean(axis = 1) display(arr3, arr4) # 形状改变,arr4改为了四行一列 display(arr4.reshape(4, 1)) # arr3为四行五列 arr3 - arr4.reshape(4, 1)
2.3 三维数组的广播
import numpy as np arr1 = np.array([0,1,2,3,4,5,6,7]*3).reshape(3,4,2) #shape(3,4,2) arr2 = np.array([0,1,2,3,4,5,6,7]).reshape(4,2) #shape(4,2) print('三维数组:') display(arr1) print('二维数组:') display(arr2) arr3 = arr1 + arr2 # arr2数组在0维上复制3份 shape(3,4,2) arr3
3.通用函数
3.1 元素级数字函数
🚩NumPy 中和数学相关的函数有很多:abs、sqrt、square、exp、log、sin、cos、tan,maxinmum、minimum、all、any、inner、clip、round、trace、ceil、floor,下面我们挑几个常用的进行代码演示,感兴趣的读者可以自己搜索其他函数的用法并实践,这里不做过多演示:
# 圆周率 display(np.pi) # 计算 sin90° display(np.sin(90)) # 这是不合法的,90是int型,而非度数 display(np.sin(np.pi / 2)) # pi 是 180°,故 pi / 2 就代表 90° # 计算 cos90° display(np.cos(np.pi / 2))
一个很有意思的现象出现了,计算 cos90°的结果并不显示0,而是显示e-7,这是因为我们在计算的过程中会有精度问题,故我们一般表示0即当一个数小于一个很小的数的时候,我们就认为这个数为0,我们可以使用 round(n) 函数让它保留n位小数:
# 保留一位小数: display(np.cos(np.pi / 2).round(1)) # 保留五位小数: display(np.cos(np.pi / 2).round(5))
可以看到,就算我们保留五位小数,依旧是0,故我们认为这个数是0
# 开平方 display(np.sqrt(1024)) # 平方 display(np.square(8)) # 幂运算 display(np.power(2, 3)) # 计算2的3次方 # log运算 display(np.log2(16)) # 计算log以2为底16的对数
# 依次比较两个等长数组,返回对应位置元素的最大值 x = np.array([6, 6, 0, 7, 2, 5]) y = np.array([9, 5, 6, 3, 4, 2]) display(np.maximum(x, y)) # 依次比较两个等长数组,返回对应位置元素的最小值 x = np.array([6, 6, 0, 7, 2, 5]) y = np.array([9, 5, 6, 3, 4, 2]) display(np.minimum(x, y))
# 返回一维数组向量内积 arr = np.random.randint(0, 10, size = (2, 2)) display(arr) np.inner(arr[0], arr)
a = 6.66666 # 向上取整 display(np.ceil(a)) # 向下取整 display(np.floor(a))
# 裁剪,小于就拔高,大于就降低 arr = np.random.randint(0, 30, size = 20) display(arr) # 10:小于10:变成10; # 20:大于20:变成20 np.clip(arr, 10, 20)