学习TensorFlow前的NumPy核心知识点

发布于:2025-03-17 ⋅ 阅读:(19) ⋅ 点赞:(0)

学习TensorFlow前的NumPy核心知识点

一、数组创建与属性

数组创建

核心方法:使用np.array()np.zeros()np.ones()np.arange()np.linspace()创建数组。

import numpy as np

# 创建一维数组
arr1 = np.array([1, 2, 3])

# 创建全零二维数组
zeros_arr = np.zeros((2, 3))  # shape为(2,3)

# 创建等差数组
range_arr = np.arange(0, 10, 2)  # 输出: [0, 2, 4, 6, 8]

使用场景:初始化神经网络权重、生成输入数据或占位符。

数组属性

关键属性shape(形状)、dtype(数据类型)、ndim(维度数)。

arr = np.array([[1, 2], [3, 4]])
print(arr.shape)  # (2, 2)
print(arr.dtype)  # int64
print(arr.ndim)   # 2

使用场景:调试TensorFlow张量形状或数据类型时快速验证。

二、数组操作与计算

算术运算

操作:四则运算(+-*/)、点乘(np.dot())、矩阵乘法(@np.matmul())。

a = np.array([2, 0])
b = np.array([1, 1])
dot_product = np.dot(a, b)  # 2*1 + 0*1 = 2

matrix_a = np.array([[1, 2], [2, 2]])
matrix_b = np.array([[3, 4], [4, 5]])
matrix_product = matrix_a @ matrix_b  # [[11,14], [14,18]]

使用场景:神经网络中的线性层计算(如全连接层的前向传播)。

广播机制

规则:不同形状的数组在算术运算时自动扩展维度。

a = np.array([[1, 2], [3, 4]])
b = np.array([10, 20])
result = a + b  # [[11,22], [13,24]]

使用场景:批量数据处理时自动对齐维度(如批量归一化)。

三、数组变形与合并

变形操作

方法reshape()flatten()调整数组形状。

arr = np.arange(6).reshape(2, 3)  # [[0,1,2], [3,4,5]]
flat_arr = arr.flatten()  # [0,1,2,3,4,5]

使用场景:将图像数据(如28x28像素)展平为输入向量。

合并与拆分

方法np.concatenate()np.split()

arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6]])
merged = np.concatenate((arr1, arr2), axis=0)  # 按行合并
# [[1,2], [3,4], [5,6]]

使用场景:合并多个训练批次数据或拆分验证集。

四、高级索引与统计

切片与布尔索引

操作:通过条件筛选数据。

arr = np.array([5, 10, 15, 20])
filtered = arr[arr > 10]  # [15, 20]

使用场景:数据预处理时过滤异常值。

统计函数

常用函数np.sum()np.mean()np.max()

data = np.array([[1, 2], [3, 4]])
sum_all = np.sum(data)        # 10
mean_col = np.mean(data, axis=0)  # [2, 3]

使用场景:计算损失函数(如均方误差)或评估指标。

五、数据类型转换

方法astype()转换数据类型。

arr = np.array([1, 2, 3], dtype=np.float32)
int_arr = arr.astype(np.int32)  # [1,2,3] (int类型)

使用场景:图像数据归一化(将uint8转换为float32)。

六、与TensorFlow的衔接

无缝转换:TensorFlow张量与NumPy数组可直接互转。

import tensorflow as tf

np_array = np.ones((2, 2))
tf_tensor = tf.constant(np_array)  # 转换为TensorFlow张量
back_to_np = tf_tensor.numpy()     # 转回NumPy数组

使用场景:数据加载后通过tf.data.Dataset输入模型。

补充的NumPy核心知识点

七、随机数生成

方法np.random模块生成随机数,如rand()randn()randint()

# 生成均匀分布随机数组(0~1之间)
uniform_data = np.random.rand(3, 2)  # 3行2列

# 生成正态分布随机数组(均值为0,标准差为1)
normal_data = np.random.randn(100)   # 100个样本

# 生成随机整数(范围1~10)
int_data = np.random.randint(1, 10, size=(5,))  # 如[3,7,2,9,5]

使用场景:神经网络权重初始化、数据增强(随机噪声)、Dropout层的随机掩码生成。

八、文件输入/输出

方法np.save()np.load()保存和加载数组数据。

# 保存数组到文件
data = np.array([[1, 2], [3, 4]])
np.save("data.npy", data)  

# 加载数据
loaded_data = np.load("data.npy")

使用场景:存储预处理后的数据集(如图像特征)、加载预训练模型参数。

九、线性代数函数

关键函数np.linalg.norm()(范数)、np.linalg.inv()(逆矩阵)、np.linalg.eig()(特征值)。

matrix = np.array([[2, 1], [1, 2]])

# 计算矩阵的逆
inv_matrix = np.linalg.inv(matrix)  # [[ 0.666, -0.333], [-0.333, 0.666]]

# 计算L2范数
norm = np.linalg.norm(matrix)  # 3.0(√(2²+1²+1²+2²))

使用场景:正则化(如L2范数惩罚项)、主成分分析(PCA)降维。

十、布尔掩码与高级索引

操作:使用布尔数组或整数数组索引。

data = np.array([[10, 20], [30, 40], [50, 60]])

# 布尔索引(选择第一列大于20的行)
mask = data[:, 0] > 20  # [False, True, True]
result = data[mask]      # [[30,40], [50,60]]

# 整数数组索引
indices = np.array([0, 2])
selected = data[indices] # [[10,20], [50,60]]

使用场景:数据清洗(过滤异常样本)、批量选择特定样本。

十一、向量化操作与性能优化

核心思想:避免Python循环,用NumPy内置函数加速计算。

# 低效方式(循环)
arr = np.random.rand(10000)
slow_sqrt = [np.sqrt(x) for x in arr]

# 高效方式(向量化)
fast_sqrt = np.sqrt(arr)

使用场景:大规模数据预处理(如图像归一化)、自定义损失函数实现。

十二、内存管理与视图/副本

概念

  • 视图(View):共享数据内存的数组(如切片操作)。
  • 副本(Copy):独立内存的新数组(需显式调用copy())。
arr = np.array([1, 2, 3, 4])
view_arr = arr[1:3]   # 视图(修改view_arr会影响arr)
copy_arr = arr.copy() # 副本(独立内存)

使用场景:处理大型数据集时减少内存占用(如分块加载数据)。

十三、结构化数组与记录数组

方法:定义复杂数据类型(类似Pandas的DataFrame)。

# 定义结构化数据类型
dtype = [('name', 'S10'), ('age', 'i4'), ('score', 'f4')]
data = np.array([('Alice', 25, 89.5), ('Bob', 30, 92.0)], dtype=dtype)

# 按字段查询
ages = data['age']  # [25, 30]

使用场景:处理非数值数据(如带标签的异构数据集)。

十四、通用函数(ufunc)

作用:对数组元素执行快速逐元素运算(如np.sin()np.exp())。

x = np.array([0, np.pi/2, np.pi])
sin_x = np.sin(x)  # [0, 1, 0]
exp_x = np.exp(x)  # [1, 4.81, 23.14]

使用场景:激活函数计算(如Sigmoid、ReLU)、自定义层实现。

十五、数组重复与平铺

方法np.repeat()np.tile()扩展数组维度。

arr = np.array([1, 2])
repeated = np.repeat(arr, 3)  # [1,1,1,2,2,2]
tiled = np.tile(arr, (2, 1))   # [[1,2], [1,2]]

使用场景:数据增强(复制样本)、构建卷积核的多通道扩展。

总结

掌握上述NumPy知识点后,能够高效地处理TensorFlow中的张量操作、数据预处理以及模型调试。在实际应用中,例如图像分类任务,需要将图像数据转换为NumPy数组并进行归一化和变形,然后输入到TensorFlow模型中进行训练。

以上知识点进一步涵盖了数据处理、数学运算和性能优化,尤其在以下场景中具有广泛的应用:

数据预处理

  • 文件加载:使用np.load()加载预处理后的数据。
  • 类型转换:通过astype()将数据转换为所需的类型。
  • 异常值过滤:利用布尔索引arr[condition]筛选出正常数据。

模型训练

  • 权重初始化:借助np.random模块生成符合特定分布的初始权重。
  • 矩阵运算:运用np.dot()np.matmul()等函数实现全连接层的矩阵乘法。
  • 激活函数计算:使用通用函数np.relu()np.sigmoid()等计算激活值。

结果分析

  • 统计指标计算:利用np.mean()np.std()等函数评估模型性能。
  • 特征工程:通过np.linalg模块实现PCA降维,提取主要特征。

掌握这些内容后,可以更高效地将NumPy与TensorFlow结合,处理复杂深度学习任务。