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. 从最右边的维度开始比较

  2. 维度必须相等,或者其中一个为1,或者其中一个不存在

  3. 所有张量都会自动扩展以匹配最大张量的形状

3. concat(连接)- 合并张量

作用:沿着指定维度连接多个张量