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专家,掌握以下三点最为关键:

  1. 向量化思维:尽量避免使用 for 循环处理数据,改用NumPy的数组运算。
  2. 形状感知:时刻关注 .shape,大多数报错(如 ValueError)都是因为维度不匹配。
  3. 利用广播:理解广播机制可以让你写出非常简洁的代码。

Numpy 详解
https://hb2cpc.top/2025/12/numpy
作者
hb2cpc
发布于
2025年12月22日
许可协议