Numpy库:聚合与广播

1 聚合:最大值、最小值和其他值

在处理数组时,我们一般会用到Numpy库中的函数,但标准库中的函数也能计算数组内的最大值、最小值等。
针对于一维数组的处理,两个库里的函数得到的结果是一样的。然而,针对于二维数组的处理,二者的函数在参数的设置上差别较大,类似的参数设置得到的结果也可能不同。
相比于标准库中的函数(sum()等),Numpy库中的函数有一个独特的形参axis(可以设置为0,也可以设置1)。
axis指定的是数组将会被折叠的维度,而不是将要返回的维度,因此axis=0意味着沿着行方向的轴会被折叠,得到的是每列的聚合。axis=1则是沿着列方向的轴会被折叠,得到的是每行的聚合。
但是呢,sum等函数也不是没有类似的参数,这里可以用位置传参(第二个位置),也可以设置0和1,并且和上述的过程一致。不过其他函数的具体情况还不清楚,还没试过,但我的说法是Numpy库中的函数用于数组已经很灵活了。至于sum这些函数平常用来算下列表得了,两者稍微区分下使用。上面说了那么多,其实还是为了介绍Numpy库中的函数。OK,正题来了,需要说明的是以下内容均来自和鲸社区,本文的目的仅记录与传播。

例子:数组值求和

import numpy as np
# np.sum(array)与sum(array)并不等同,np.sum速度更快且知道数组维度
# np.sum和sum一维数组结果相同,np.sum二维数组默认对所有元素求和,必要时可以指定,sum二维数组沿着行方向求和
L = np.random.random(100)
print('sum(一维)', sum(L))
print('np.sum(一维)', np.sum(L))

m = np.array([[1, 2, 3],
               [4, 5, 6]])
print('sum(二维)', sum(m))
print('np.sum(二维)', np.sum(m))
print('np.sum(二维, 沿着行方向每列求和,axis = 0)', np.sum(m, axis = 0))
print('np.sum(二维, 沿着列方向每行求和,axis = 1)', np.sum(m, axis = 1))

sum(一维) 49.71941969886835
np.sum(一维) 49.719419698868336
sum(二维) [5 7 9]
np.sum(二维) 21
np.sum(二维, 沿着行方向每列求和,axis = 0) [5 7 9]
np.sum(二维, 沿着列方向每行求和,axis = 1) [ 6 15]

2 广播

广播可以简单理解为用于不同大小数组的二元通用函数(加、减、乘等)的一组规则,同之前的常用通用函数一样,都是通过向量化的操作减少缓慢的python循环

2.1 同样大小的数组或和一个标量(123等)
# 对于同样大小的数组,二元运算符是对相应元素逐个计算
a = np.array([0, 1, 2])
b = np.array([5, 5, 5])
print(a + b)
# 广播允许二元运算符用于不同大小的数组,例如简单将一个标量(可以理解为一个零维的数组)和一个数组相加
# 可以理解为先将数值5扩展为数组[5, 5, 5]然后执行加法
print(a + 5)

[5 6 7]
[5 6 7]

2.2 延伸:广播规则

规则1:如果两个数组的维度数不同,那么小维度数组的形状将会在最左边补1

规则2:如果两个数组的形状在任何一个维度上都不匹配,那么数组的维度会沿着维度为1的维度扩展以匹配另外一个数组的形状

规则3:如果两个数组的形状在任何一个维度上都不匹配并且没有任何一个维度等于1,那么就会引发异常

# 广播示例 1 :将一个二维数组和一个一维数组相加
M = np.ones((2, 3))
a = np.arange(3)
print(M, a)
print(M.shape, a.shape)
print('根据规则1,数组a的维度更小,所以在其左边补1,m.shape(2, 3) a.shape(1, 3)')
print('根据规则2,两个数组第一个维度不匹配,扩展数组a以匹配数组,a.shape(2, 3)')
M + a

[[1. 1. 1.]
[1. 1. 1.]] [0 1 2]
(2, 3) (3,)
根据规则1,数组a的维度更小,所以在其左边补1,m.shape(2, 3) a.shape(1, 3)
根据规则2,两个数组第一个维度不匹配,扩展数组a以匹配数组,a.shape(2, 3)
array([[1., 2., 3.],
[1., 2., 3.]])

# 广播示例 2:两个数组均需要广播
a = np.arange(3).reshape(3, 1)
b = np.arange(3)
print(a, b)
print(a.shape, b.shape)
print('根据规则1,数组b的维度更小,所以在其左边补1,a.shape(3, 1) b.shape(1, 3)')
print('根据规则2,两个数组维度不匹配,扩展两个数组,a.shape(3, 3) b.shape(3, 3)')
print('''
[[0, 0, 0],
 [1, 1, 1],
 [2, 2, 2]] + [[0, 1, 2],
               [0, 1, 2],
               [0, 1, 2]] = \n''', a + b)

[[0]
[1]
[2]] [0 1 2]
(3, 1) (3,)
根据规则1,数组b的维度更小,所以在其左边补1,a.shape(3, 1) b.shape(1, 3)
根据规则2,两个数组维度不匹配,扩展两个数组,a.shape(3, 3) b.shape(3, 3)
在这里插入图片描述

2.3 广播实际运用(可不看,就是介绍下归一化)

2.3.1 归一化

1、数组的归一化
数组归一化是将数组的数值范围缩放到特定范围或标准化的过程。在数据处理和机器学习中,常常需要对数据进行归一化,以便使数据具有一致的尺度和范围,从而有助于模型的训练和预测。

常见的数组归一化方法包括:
1、最小-最大归一化(Min-Max Scaling): 这是最常见的归一化方法之一。它将数据缩放到指定的范围,通常是 [0, 1]。
2、标准化(Standardization): 这种方法将数据转换为均值为 0、标准差为 1 的正态分布(也叫标准正态分布)。标准化使得数据分布更符合统计假设,有助于某些机器学习算法的性能。

为什么要进行数组归一化?

1、消除尺度影响: 不同的特征可能具有不同的尺度和范围,这可能会对某些机器学习算法产生负面影响。通过归一化,可以消除特征之间的尺度差异,使得算法更加稳定。
2、加速收敛: 对于许多优化算法(如梯度下降),归一化可以加速算法的收敛过程,使其更快地达到最优解。
3、提高模型性能: 在某些情况下,归一化可以提高机器学习模型的性能,因为模型更容易学习和泛化归一化后的数据。
4、可视化和解释性: 归一化后的数据更容易可视化和解释,因为它们具有相似的尺度。

需要注意的是,在某些情况下,不需要进行数组归一化,特别是当数据已经在合适的尺度范围内时,或者某些特定的机器学习算法不敏感于尺度差异时。因此,在进行数组归一化之前,需要仔细考虑数据的性质和算法的要求。

2.3.2 广播在二维函数的运用及其图像(imshow)

# 定义一个二维函数 z = f(x, y),可以用广播沿着数值区间计算该函数
# x和y表示0-5区间50个步长的序列
x = np.linspace(0, 5, 50)
y = np.linspace(0, 5, 50)[:, np.newaxis]
z = np.sin(x) ** 10 + np.cos(10 + y * x) * np.cos(x)
print(z)
# 画出二维数组
"""
z:这是要显示的二维数据(通常是一个矩阵或图像)。imshow 将根据这个数据创建一个可视化呈现。
origin:这是一个可选参数,指定了图像数据的坐标原点位置。默认情况下,原点位于图像的左上角('upper'),但在一些情况下,你可能希望将原点移到左下角('lower'),这在处理科学数据时很常见。
extent:这是一个可选参数,用于指定数据的坐标范围。它是一个包含四个值的列表,分别表示 x 轴的起始值、结束值、y 轴的起始值和结束值。在你的代码中,extent=[0, 5, 0, 5] 意味着 x 和 y 轴的坐标范围分别从 0 到 5。
cmap:这是一个可选参数,用于指定用于渲染图像的颜色映射(colormap)。颜色映射定义了数据值如何映射到颜色。在你的代码中,cmap='viridis' 使用了名为 "viridis" 的颜色映射,这是 Matplotlib 内置的一种颜色映射。
plt.colorbar在当前图形(通常是通过 plt.imshow() 绘制的图形)旁边或下方添加一个颜色条。颜色条将显示图像中不同颜色所对应的数据值的范围。通常,颜色条的上端表示数据的最大值,下端表示数据的最小值。通过查看颜色条,用户可以快速了解图像中不同颜色所代表的数据含义,从而提高图像的可解释性。
"""
import matplotlib.pyplot as plt
plt.imshow(z, origin = 'lower', extent = [0, 5, 0, 5], cmap = 'viridis')
plt.colorbar()

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值