当前位置: 首页 > news >正文

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

关键点总结

  1. 按列操作axis=0 确保计算每列的独立最小值/最大值。

  2. 广播机制min_vals 和 max_vals 被扩展为与 matrix 形状匹配。

  3. 归一化公式

通过此过程,原始数据被映射到 [0, 1] 区间,保持每列的分布比例。

2. 处理极值(全相同元素)

若数组所有元素相等,返回全0:

arr = np.array([7, 7, 7])
print(normalize(arr))  # 输出 [0, 0, 0]

注意事项

  1. 数据类型:若输入为整数数组,结果自动转为浮点型。

  2. 极值处理:当 max⁡(X)=min⁡(X)max(X)=min(X) 时,避免除以零错误。

  3. 内存效率:返回的数组是原数组的副本(非视图)。


可视化验证

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] 区间。


通过上述方法,可以高效实现数组的归一化,适用于数据预处理、特征缩放等场景。

相关文章:

  • 力扣 797. 所有可能的路径 解析JS、Java、python、Go、c++
  • 第2章:容器核心原理:深入理解Namespace、Cgroup与联合文件系统
  • 自动化测试框架pytest+requests+allure
  • Lambda 表达式的语法:
  • 【STL】string类用法介绍及部分接口的模拟实现
  • SpringBoot整合LangChain4j操作AI大模型实战详解
  • 自研实时内核稳定性问题 - I2C总线 - UAF内存异常问题
  • 计算斜着椭圆内某个点到边距离(验证ok)
  • SpringSecurity——基于角色权限控制和资源权限控制
  • 使用`plot_heatmap`绘制热力图时
  • Android之悬浮窗实现
  • 如何设计一个 RPC 框架?需要考虑哪些点?
  • 结合基于标签置信度的特征选择方法用于部分多标签学习-简介版
  • C++ —— 线程同步(互斥锁)
  • vue 中常用操作数组的方法
  • Minecraft命令总结(持续更新)
  • Deal - DbC、检查Python 值、异常和副作用
  • 鸿蒙NEXT项目实战-百得知识库03
  • jpa报错 Validation failed for query for method public abstract
  • MySQL单表查询
  • 多人称华为手机忽现拍照模糊疑存缺陷,售后回应:主摄像头故障
  • 黄玮接替周继红出任国家体育总局游泳运动管理中心主任
  • 江苏省泰州市委常委、宣传部部长刘霞接受审查调查
  • 三大交易所多举措支持科创债再扩容,约160亿证券公司科创债有望近期落地
  • 央行行长:未来还可以扩大结构性货币政策工具规模或创设新的政策工具
  • 加拿大总理访美与特朗普“礼貌交火”