学习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结合,处理复杂深度学习任务。