NumPy 教程

NumPy 是 Python 中用于科学计算的核心库,提供了高效的多维数组操作和数学函数支持。它是许多数据科学和机器学习库(如 Pandas、SciPy、TensorFlow)的基础。以下是对 NumPy 的中文简介,涵盖其定义、核心功能、数组操作、常见用法、注意事项及最佳实践,帮助你快速了解并掌握 NumPy。


一、NumPy 概述

1. 什么是 NumPy?

  • 全称:Numerical Python
  • 定义:NumPy 是一个开源的 Python 库,用于高效处理多维数组(ndarray)和数学计算。
  • 特点
  • 高性能数组:基于 C 实现,操作速度远超 Python 原生列表。
  • 多维数组:支持任意维度的数组(1D、2D、3D 等)。
  • 丰富数学函数:提供线性代数、统计、随机数生成等功能。
  • 跨平台:支持 Windows、macOS、Linux。
  • 用途
  • 数据处理和分析。
  • 科学计算(如矩阵运算、傅里叶变换)。
  • 机器学习和深度学习的数据预处理。

2. 安装 NumPy

  • 使用 pip 安装:
  pip install numpy
  • 验证安装:
  import numpy as np
  print(np.__version__)  # 输出 NumPy 版本

二、NumPy 核心功能

1. ndarray(N 维数组)

  • 定义:NumPy 的核心数据结构是 ndarray(N-dimensional array),用于存储同类型元素的多维数组。
  • 特点
  • 固定大小,创建后不可动态扩展。
  • 支持高效的向量化和广播操作。
  • 内存连续,访问速度快。
  • 属性
  • shape:数组形状(如 (3, 2) 表示 3 行 2 列)。
  • dtype:元素数据类型(如 int32float64)。
  • ndim:数组维数。
  • size:元素总数。

2. 高效的数学运算

  • 支持元素级运算(如加、减、乘、除),无需显式循环。
  • 提供线性代数、统计、随机数等函数。

3. 广播机制

  • 自动扩展不同形状数组的运算,简化代码。
  • 示例:标量与数组相加,自动应用于每个元素。

4. 跨库兼容性

  • 与 Pandas、Matplotlib、SciPy 等无缝集成。
  • 支持数据导入导出(如 CSV、NumPy 格式)。

三、创建 NumPy 数组

1. 从 Python 列表创建

import numpy as np

# 一维数组
arr1 = np.array([1, 2, 3])
print(arr1)  # 输出:[1 2 3]

# 二维数组
arr2 = np.array([[1, 2], [3, 4], [5, 6]])
print(arr2)  # 输出:
# [[1 2]
#  [3 4]
#  [5 6]]

2. 使用内置函数创建

  • 全零数组
  zeros = np.zeros((2, 3))  # 2x3 零矩阵
  print(zeros)  # 输出:
  # [[0. 0. 0.]
  #  [0. 0. 0.]]
  • 全一数组
  ones = np.ones((2, 3))  # 2x3 单位矩阵
  print(ones)  # 输出:
  # [[1. 1. 1.]
  #  [1. 1. 1.]]
  • 指定值填充
  full = np.full((2, 2), 5)  # 2x2 填充 5
  print(full)  # 输出:
  # [[5 5]
  #  [5 5]]
  • 等差序列
  arange = np.arange(0, 10, 2)  # 从 0 到 10,步长 2
  print(arange)  # 输出:[0 2 4 6 8]
  • 均匀分布
  linspace = np.linspace(0, 1, 5)  # 从 0 到 1,生成 5 个点
  print(linspace)  # 输出:[0.   0.25 0.5  0.75 1.  ]
  • 随机数数组
  random = np.random.rand(2, 3)  # 2x3 随机数(0-1)
  print(random)  # 输出:随机值

四、数组操作

1. 索引与切片

  • 一维数组
  arr = np.array([1, 2, 3, 4])
  print(arr[0])  # 输出:1
  print(arr[1:3])  # 输出:[2 3]
  • 二维数组
  arr2d = np.array([[1, 2], [3, 4], [5, 6]])
  print(arr2d[0, 1])  # 输出:2
  print(arr2d[:, 0])  # 输出:[1 3 5](第一列)

2. 形状操作

  • 查看形状
  arr = np.array([[1, 2], [3, 4]])
  print(arr.shape)  # 输出:(2, 2)
  • 改变形状
  arr = np.array([1, 2, 3, 4])
  reshaped = arr.reshape(2, 2)
  print(reshaped)  # 输出:
  # [[1 2]
  #  [3 4]]
  • 展平数组
  flattened = arr2d.flatten()
  print(flattened)  # 输出:[1 2 3 4 5 6]

3. 数学运算

  • 元素级运算
  arr = np.array([1, 2, 3])
  print(arr + 2)  # 输出:[3 4 5]
  print(arr * 2)  # 输出:[2 4 6]
  • 数组间运算
  arr1 = np.array([1, 2])
  arr2 = np.array([3, 4])
  print(arr1 + arr2)  # 输出:[4 6]
  • 矩阵运算
  arr = np.array([[1, 2], [3, 4]])
  print(np.dot(arr, arr))  # 矩阵乘法
  # 输出:
  # [[ 7 10]
  #  [15 22]]

4. 统计函数

  • 均值、标准差
  arr = np.array([1, 2, 3, 4])
  print(np.mean(arr))  # 输出:2.5
  print(np.std(arr))   # 输出:1.118...
  • 最大/最小值
  print(np.max(arr))  # 输出:4
  print(np.min(arr))  # 输出:1
  • 求和
  print(np.sum(arr))  # 输出:10

五、广播机制

广播(Broadcasting)允许 NumPy 对不同形状的数组进行运算:

arr = np.array([[1, 2], [3, 4]])
scalar = 2
print(arr + scalar)  # 输出:
# [[3 4]
#  [5 6]]
  • 规则
  • 数组形状必须兼容(维度相等或一维为 1)。
  • 较小数组自动扩展以匹配较大数组的形状。

六、常见用法示例

1. 数据预处理

标准化数据(零均值、单位方差):

data = np.array([1, 2, 3, 4, 5])
standardized = (data - np.mean(data)) / np.std(data)
print(standardized)  # 输出:[-1.414... -0.707... 0. 0.707... 1.414...]

2. 矩阵运算

矩阵转置和求逆:

matrix = np.array([[1, 2], [3, 4]])
transposed = matrix.T
inverse = np.linalg.inv(matrix)
print(transposed)  # 输出:
# [[1 3]
#  [2 4]]
print(inverse)  # 输出:
# [[-2.   1. ]
#  [ 1.5 -0.5]]

3. 随机数生成

生成随机整数:

random_ints = np.random.randint(0, 10, size=(2, 3))
print(random_ints)  # 输出:2x3 随机整数矩阵

4. 数据保存与加载

  • 保存为 .npy 文件:
  arr = np.array([1, 2, 3])
  np.save("array.npy", arr)
  • 加载:
  loaded = np.load("array.npy")
  print(loaded)  # 输出:[1 2 3]

七、注意事项

  1. 数据类型(dtype)
  • NumPy 数组元素类型固定,创建时可指定(如 np.array([1, 2], dtype=np.float64))。
  • 错误类型可能导致精度丢失(如 int 存储浮点数)。
  1. 内存效率
  • NumPy 数组比 Python 列表更节省内存,因存储连续且类型固定。
  • 大数组操作需注意内存使用。
  1. 广播限制
  • 形状不兼容的数组运算会抛出 ValueError
  • 示例:
    python arr1 = np.array([1, 2]) arr2 = np.array([1, 2, 3]) # arr1 + arr2 # 报错:形状不匹配
  1. 性能优化
  • 避免循环,使用 NumPy 的向量化和内置函数。
  • 示例:
    python # 慢:循环 for i in range(len(arr)): arr[i] += 1 # 快:向量化 arr += 1

八、最佳实践

  1. 使用向量化操作
  • 优先使用 NumPy 的内置函数和广播,避免 Python 循环。
   arr = np.array([1, 2, 3])
   arr = arr * 2  # 高效
  1. 指定数据类型
  • 根据需求选择合适类型(如 int32float64)以节省内存。
   arr = np.array([1, 2, 3], dtype=np.int16)
  1. 检查数组形状
  • 操作前确认 shapendim,避免错误。
   print(arr.shape, arr.ndim)
  1. 缓存大数组
  • 使用 np.save/np.load 保存中间结果,减少重复计算。
  1. 结合其他库
  • 与 Pandas(数据分析)、Matplotlib(可视化)结合使用。
   import pandas as pd
   df = pd.DataFrame(np.array([[1, 2], [3, 4]]))
  1. 调试技巧
  • 使用 np.set_printoptions 控制输出格式。
   np.set_printoptions(precision=2)  # 保留 2 位小数

九、总结

NumPy 是 Python 科学计算的核心库,提供高效的 ndarray 对象和丰富的数学函数,支持多维数组操作、线性代数、统计分析等功能。掌握数组创建、索引、运算、广播机制及常见用法,能显著提升数据处理效率。遵循最佳实践(如向量化操作、指定数据类型),并结合 Pandas、Matplotlib 等库,可满足科学计算和数据分析需求。

如果你需要更复杂的示例(如高级矩阵运算、性能优化)或特定场景的 NumPy 代码,请告诉我!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注