Numpy 详解
Numpy
NumPy(Numerical Python)是Python数据科学和机器学习领域的基石。你可以把它想象成Python在处理数字时的“超级计算器”。它之所以强大,是因为它在底层使用了C语言进行优化,处理大规模数组和矩阵运算时,比Python自带的列表(List)快得多。
以下是NumPy的核心概念、常用方法及代码示例。
1. 安装与导入
在使用之前,你需要确保环境中已经安装了NumPy。
- 安装命令:
pip install numpy
-
导入惯例:
在代码中,我们通常将NumPy简写为np。import numpy as np
2. 创建数组 (Array Creation)
NumPy的核心是 ndarray(N-dimensional array,N维数组)。
np.array(): 将Python列表转换为NumPy数组。np.zeros()/np.ones(): 创建全0或全1的数组。np.arange(): 类似于Python的range(),创建等差数列。np.linspace(): 在指定范围内生成均匀分布的数字。np.random.rand(): 生成随机数。
代码示例:
import numpy as np
# 1. 从列表创建
arr = np.array([1, 2, 3, 4, 5])
print(f"普通数组: {arr}")
# 2. 创建全0矩阵 (3行4列)
zeros = np.zeros((3, 4))
print(f"\n全0矩阵:\n{zeros}")
# 3. 创建范围数组 (0到9)
range_arr = np.arange(10)
print(f"\n范围数组: {range_arr}")
# 4. 线性等分 (0到10之间切成5份)
lin_arr = np.linspace(0, 10, 5)
print(f"\n线性等分: {lin_arr}")
# 5. 随机矩阵 (2行3列,0到1之间)
rand_arr = np.random.rand(2, 3)
print(f"\n随机矩阵:\n{rand_arr}")
3. 数组属性与形状操作 (Attributes & Reshaping)
了解数组的“长相”非常重要,特别是在进行矩阵运算时。
.shape: 获取数组的维度(行数,列数)。.ndim: 获取数组的维度数量(是1维、2维还是3维)。.dtype: 查看数组中元素的数据类型。.reshape(): 改变数组的形状(不改变数据本身)。
代码示例:
arr = np.arange(12) # [0, 1, ..., 11]
# 查看属性
print(f"原始形状: {arr.shape}")
print(f"维度: {arr.ndim}")
# 改变形状:变成 3行4列 的矩阵
reshaped_arr = arr.reshape(3, 4)
print(f"\n变形后的矩阵 (3x4):\n{reshaped_arr}")
# 注意:变形后的元素总数必须一致 (3*4 = 12)
4. 索引与切片 (Indexing & Slicing)
就像操作Excel表格或Python列表一样,我们需要提取数组中的特定数据。
- 基础索引:
arr[行, 列] - 切片:
arr[开始:结束]
代码示例:
matrix = np.array([[10, 20, 30],
[40, 50, 60],
[70, 80, 90]])
# 提取第2行,第3列的元素 (索引从0开始)
# 对应数字 60
element = matrix[1, 2]
print(f"提取元素: {element}")
# 提取前两行
first_two_rows = matrix[:2, :]
print(f"\n前两行:\n{first_two_rows}")
# 提取所有行的第2列
second_col = matrix[:, 1]
print(f"\n第2列: {second_col}")
5. 数学运算 (Mathematical Operations)
这是NumPy最强大的地方。它支持向量化运算,意味着你可以直接对整个数组进行加减乘除,而不需要写循环。
- 基本运算:
+,-,*,/(对应元素进行运算)。 - 矩阵乘法:
np.dot()或@符号。 - 统计函数:
np.sum(),np.mean()(平均值),np.max(),np.std()(标准差)。
假设我们要计算两个矩阵 \mathbf{A} 和 \mathbf{B} 的乘积,公式为 \mathbf{C} = \mathbf{A} \cdot \mathbf{B}。
代码示例:
a = np.array([[1, 2],
[3, 4]])
b = np.array([[5, 6],
[7, 8]])
# 1. 对应元素相乘 (Element-wise multiplication)
# 结果是 [[1*5, 2*6], [3*7, 4*8]]
print(f"对应元素相乘:\n{a * b}")
# 2. 矩阵乘法 (Matrix Multiplication / Dot Product)
# 结果是行乘以列的累加
dot_product = np.dot(a, b)
# 或者使用 @ 符号 (Python 3.5+)
dot_product_symbol = a @ b
print(f"\n矩阵乘法结果:\n{dot_product}")
# 3. 统计计算
print(f"\n矩阵A的所有元素之和: {np.sum(a)}")
print(f"矩阵A的平均值: {np.mean(a)}")
6. 广播机制 (Broadcasting)
广播是NumPy的一种智能机制。当两个数组形状不同时,NumPy会自动尝试“扩展”较小的数组,使其与较大的数组形状匹配,以便进行运算。
例如,将一个标量(数字)加到一个矩阵上:
\begin{bmatrix} 1 & 2 \\ 3 & 4 \end{bmatrix} + 10 = \begin{bmatrix} 11 & 12 \\ 13 & 14 \end{bmatrix}
代码示例:
arr = np.array([[1, 2, 3],
[4, 5, 6]])
# 将数字 10 加到数组的每一个元素上
result = arr + 10
print(f"广播机制结果:\n{result}")
7. 常用线性代数函数 (Linear Algebra)
在高级IT应用(如图像处理、AI算法)中,经常需要用到线性代数。
np.linalg.inv(): 计算逆矩阵 \mathbf{A}^{-1}。np.linalg.eig(): 计算特征值和特征向量。np.transpose()或.T: 计算转置矩阵 \mathbf{A}^T。
代码示例:
matrix = np.array([[1, 2],
[3, 4]])
# 1. 转置矩阵
print(f"转置矩阵:\n{matrix.T}")
# 2. 逆矩阵
try:
inv_matrix = np.linalg.inv(matrix)
print(f"\n逆矩阵:\n{inv_matrix}")
except np.linalg.LinAlgError:
print("该矩阵不可逆")
总结
NumPy是数据处理的基础。作为IT专家,掌握以下三点最为关键:
- 向量化思维:尽量避免使用
for循环处理数据,改用NumPy的数组运算。 - 形状感知:时刻关注
.shape,大多数报错(如ValueError)都是因为维度不匹配。 - 利用广播:理解广播机制可以让你写出非常简洁的代码。
Numpy 详解
https://hb2cpc.top/2025/12/numpy