目录

学习TensorFlow前的NumPy核心知识点

学习TensorFlow前的NumPy核心知识点

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