numpy学习笔记12:实现数组的归一化(0-1范围)
numpy学习笔记12:实现数组的归一化(0-1范围)
归一化的基本概念:
归一化通常是将数据缩放到一个特定区间。
归一化的公式是将每个元素减去最小值,然后除以最大值和最小值的差。
在NumPy中,可以用np.min()和np.max()来获取数组的最小值和最大值。然后,用这些值来计算每个元素的归一化值。
步骤是:
1. 计算数组的最小值。
2. 计算数组的最大值。
3. 使用公式 (arr - min) / (max - min) 进行归一化。
4. 确保结果在0到1之间。
以下是使用 NumPy 实现数组归一化到 [0, 1] 范围的详细步骤和代码:
归一化公式
实现代码
1. 基础归一化
import numpy as np def normalize(arr): min_val = np.min(arr) max_val = np.max(arr) # 处理极值(若所有元素相等,返回全0) if max_val == min_val: return np.zeros_like(arr) return (arr - min_val) / (max_val - min_val) # 示例 arr = np.array([5, 10, 15, 20]) normalized_arr = normalize(arr) print("归一化结果:", normalized_arr)
输出:
归一化结果: [0. 0.33333333 0.66666667 1. ]
扩展场景
1. 按行或列归一化
通过指定 axis
参数,按特定维度归一化:
# 二维数组按列归一化 matrix = np.array([[1, 2], [3, 4]]) min_vals = np.min(matrix, axis=0) # 每列的最小值 → [1, 2] max_vals = np.max(matrix, axis=0) # 每列的最大值 → [3, 4] normalized = (matrix - min_vals) / (max_vals - min_vals)输出:
[[0. 0.]
[1. 1.]]
以下是针对二维数组按列归一化的 分步计算过程,结合示例数据
matrix = np.array([[1, 2], [3, 4]])
详细说明:
1. 输入数组结构
matrix = [[1, 2], [3, 4]]
列0:
[1, 3]
列1:
[2, 4]
2. 计算每列的最小值和最大值
(1) 按列求最小值
min_vals
沿
axis=0
(垂直方向)计算:min_vals = np.min(matrix, axis=0) # → [1, 2]
列0的最小值:
min(1, 3) = 1
列1的最小值:
min(2, 4) = 2
(2) 按列求最大值
max_vals
沿
axis=0
(垂直方向)计算:max_vals = np.max(matrix, axis=0) # → [3, 4]
列0的最大值:
max(1, 3) = 3
列1的最大值:
max(2, 4) = 4
3. 计算差值矩阵
(1)
matrix - min_vals
通过 广播机制,
min_vals
被扩展为与matrix
同形状:matrix - min_vals = [[1-1, 2-2], # → [[0, 0], [3-1, 4-2]] # [2, 2]]
4. 计算分母
max_vals - min_vals
max_vals - min_vals = [3-1, 4-2] # → [2, 2]
5. 逐元素归一化
将差值矩阵除以分母:
(matrix - min_vals) / (max_vals - min_vals) = [[0/2, 0/2], # → [[0.0, 0.0], [2/2, 2/2]] # [1.0, 1.0]]
最终结果
normalized = [[0.0, 0.0], [1.0, 1.0]]
关键点总结
按列操作:
axis=0
确保计算每列的独立最小值/最大值。广播机制:
min_vals
和max_vals
被扩展为与matrix
形状匹配。归一化公式:
通过此过程,原始数据被映射到 [0, 1] 区间,保持每列的分布比例。
2. 处理极值(全相同元素)
若数组所有元素相等,返回全0:
arr = np.array([7, 7, 7]) print(normalize(arr)) # 输出 [0, 0, 0]
注意事项
-
数据类型:若输入为整数数组,结果自动转为浮点型。
-
极值处理:当 max(X)=min(X)max(X)=min(X) 时,避免除以零错误。
-
内存效率:返回的数组是原数组的副本(非视图)。
可视化验证
import numpy as np
import matplotlib.pyplot as plt
# 配置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
original = np.random.randint(0, 100, 50)
normalized = normalize(original)
plt.figure(figsize=(10, 4))
plt.subplot(1, 2, 1)
plt.hist(original, bins=20, color='blue')
plt.title("原始数据分布")
plt.subplot(1, 2, 2)
plt.hist(normalized, bins=20, color='red')
plt.title("归一化后分布")
plt.show()
效果:原始数据分布被线性映射到 [0, 1] 区间。
通过上述方法,可以高效实现数组的归一化,适用于数据预处理、特征缩放等场景。