1.1 创建 ndarray(Numpy 的核心数据结构)
Numpy 中所有数据都是 ndarray(n-dimensional array,多维数组)。
是深度学习中所有 Tensor 的原型。
import numpy as np
# 从列表创建
a = np.array([1, 2, 3])
# 指定 dtype
b = np.array([1, 2, 3], dtype=float)
# 创建全 0 / 全 1 (2,3) 代表创建一个2x3 的二维数组
zeros = np.zeros((2, 3))
ones = np.ones((2, 3))
# 随机数组(正态分布)
randn = np.random.randn(3, 3)
# 均匀随机
rand = np.random.rand(2, 2)
# 范围数组
arr1 = np.arange(0, 10, 2) # 0, 2, 4, 6, 8
# 线性等分
arr2 = np.linspace(0, 1, 5) # 5 个点1.2 数组形状(shape)与维度(ndim)
x = np.array([[1, 2, 3],
[4, 5, 6]])
print(x.shape) # (2, 3) → 2 行 3 列
print(x.ndim) # 2 维数组
# 改变形状 reshape
a = np.arange(6) # [0 1 2 3 4 5]
b = a.reshape((2, 3)) # 2 行 3 列1.3 索引与切片
1.基本索引
x = np.array([[1,2,3], [4,5,6]])
x[0, 1] # 2
x[1] # [4,5,6]
x[:, 1] # 所有行的第 2 列 → [2,5]
x[0, :] # 第 1 行
# 切片
a = np.arange(10) # [0 1 2 ... 9]
a[2:5] # [2 3 4]
a[:3] # [0 1 2]
a[5:] # [5 6 7 8 9]
a[::2] # 步长为 2 → [0 2 4 6 8]2.布尔索引
布尔索引是 NumPy 中一种强大且高效的数据选择方法,它允许我们使用布尔值(True/False)数组来选择和操作数组中的元素。
布尔索引使用与原始数组形状相同的布尔数组作为索引,只选择对应位置为 True 的元素。
import numpy as np
arr = np.array([...])
boolean_mask = arr > 阈值 # 或其他条件
result = arr[boolean_mask] # 或直接 arr[arr > 阈值]
# 正确使用逻辑运算符
arr = np.array([1, 2, 3, 4, 5])
# 错误:使用 and/or(会报错)
# result = arr[(arr > 2) and (arr < 5)]
# 正确:使用 &/|
result = arr[(arr > 2) & (arr < 5)] # [3 4]
# 注意运算符优先级
result = arr[(arr > 1) & (arr < 5) | (arr == 1)] # 可能需要括号明确优先级1.4 数组计算(矩阵运算)
# 元素级别运算
a = np.array([1, 2, 3])
b = np.array([10, 20, 30])
print(a + b) # [11 22 33]
print(a * b) # [10 40 90]
print(a ** 2) # [1 4 9]
# 矩阵运算
A = np.array([[1,2],
[3,4]])
B = np.array([[5,6],
[7,8]])
# 计算方式:1x5+2x7,1x6+2x8,3x5+4x7,3x6+4x8
# 矩阵乘法
print(A @ B)
# 或者用 dot
print(np.dot(A, B))
1.5 广播(broadcasting)
当两个数组形状不一致时,Numpy 会尝试“扩展”它们配合计算。
a = np.array([1, 2, 3])
b = 2
print(a + b) # [3, 4, 5]
# 另一个例子
A = np.ones((3, 3))
b = np.array([1, 2, 3])
print(A + b)
# → 每一行都会加 [1,2,3]1.6 聚合函数(统计运算)
常见统计函数
x = np.array([[1,2,3],
[4,5,6]])
x.sum()
# 平均值
x.mean()
x.max()
x.min()
x.std()
# 按行/列运算
x.sum(axis=0) # 每列求和
x.sum(axis=1) # 每行求和
1.7 拼接与分割
# 拼接
np.concatenate([a, b], axis=0) # 纵向
np.concatenate([a, b], axis=1) # 横向
# 分割
np.split(a, 2)张量变换:reshape(重塑)、expand(广播)、concar(连接)
1. reshape(重塑)- 改变形状但不改变数据
作用:重新排列张量的维度,保持总元素数量不变
2. expand(扩展)- 广播维度
作用:在不复制数据的情况下扩展张量的维度(通过广播)
广播遵循三个基本原则:
从最右边的维度开始比较
维度必须相等,或者其中一个为1,或者其中一个不存在
所有张量都会自动扩展以匹配最大张量的形状
3. concat(连接)- 合并张量
作用:沿着指定维度连接多个张量