【Python】numpy-高性能科学计算基础库简介及使用指南


以下是关于 numpy 库的全面详细介绍,涵盖其核心功能、底层机制、高级用法及实际应用场景。


1. 简介

numpy(Numerical Python)是 Python 生态中用于高性能科学计算的基础库,其核心是 多维数组对象(ndarray,支持矢量化运算、广播机制和底层 C 优化。它广泛应用于数据科学、机器学习、信号处理等领域,是 pandasscikit-learnTensorFlow 等库的底层依赖。
numpy 是 Python 中用于科学计算的核心库之一,专为高效处理多维数组和矩阵运算设计。它在数据科学、机器学习、工程计算等领域广泛应用。以下是其核心特性和常见用法:

1.1性能优势

  • 矢量化计算:用 C 语言实现底层循环,避免 Python 循环开销。
  • 内存优化:连续内存存储,支持大规模数据高效处理。

1.2应用场景

  1. 数据预处理:清洗、归一化、特征工程。
  2. 数值计算:解方程、傅里叶变换、线性代数。
  3. 图像处理:像素矩阵操作(如 OpenCV 底层依赖 numpy)。
  4. 机器学习scikit-learnTensorFlow 等库的底层支持。

1.3与 Python 列表的区别

特性numpy 数组Python 列表
元素类型必须相同可以不同
内存占用紧凑,连续内存分散,存储对象引用
运算速度快(C 优化)慢(解释型循环)
功能丰富的数学函数和操作基础操作

2. 核心特性

2.1 ndarray 多维数组

  • 内存连续:元素在内存中连续存储,支持高效缓存利用。
  • 同质数据类型:所有元素类型一致(如 int32float64),通过 dtype 参数指定。
  • 维度(轴):通过 shape 属性描述数组的维度(如 (3, 4) 表示 3 行 4 列)。
示例:
import numpy as np

# 创建 2x3 数组,指定数据类型为 float32
arr = np.array([[1, 2, 3], [4, 5, 6]], dtype=np.float32)
print(arr.shape)  # (2, 3)
print(arr.dtype)  # float32

2.2 矢量化运算

  • 避免显式循环:直接对数组进行数学运算,底层由 C 实现循环,性能提升数十到数百倍。
  • 支持所有算术运算符+, -, *, /, ** 等)和逻辑运算符(>, == 等)。
示例:
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

print(a + b)   # [5 7 9]
print(a * 2)   # [2 4 6]
print(a > 1)   # [False  True  True]

2.3 广播(Broadcasting)

允许不同形状的数组进行算术运算,规则如下:

  1. 从最右侧维度开始对齐,维度大小相等或其中一个为 1。
  2. 缺失的维度自动补 1。
示例:
# 3x3 矩阵 + 1x3 行向量 → 自动广播为 3x3
matrix = np.ones((3, 3))
row = np.array([1, 2, 3])
result = matrix + row  # 等价于 matrix + row.reshape(1, 3)

2.4 通用函数(ufunc)

  • 逐元素操作的函数:如 np.sin(), np.exp(), np.log()
  • 自定义 ufunc:通过 np.frompyfunc() 将 Python 函数转换为 ufunc。
示例:
arr = np.array([0, np.pi/2, np.pi])
print(np.sin(arr))  # [0. 1. 0.]

3. 数组操作

3.1 索引与切片

  • 基础索引:类似 Python 列表,但支持多维。
  • 布尔索引:通过布尔数组筛选元素。
  • 花式索引:用整数数组指定复杂索引。
示例:
arr = np.arange(12).reshape(3, 4)

# 基础切片
print(arr[1, :])      # 第2行:[4 5 6 7]
print(arr[:, 1::2])   # 所有行,第2列开始,每隔一列取一列

# 布尔索引
mask = arr > 5
print(arr[mask])      # [6, 7, 8, 9, 10, 11]

# 花式索引
print(arr[[0, 2], [1, 3]])  # 取(0,1)和(2,3)位置的元素 → [1, 11]

3.2 形状操作

  • 调整形状reshape(), resize(), flatten()
  • 转置与轴交换T, transpose(), swapaxes()
  • 连接与分割np.concatenate(), np.split(), np.vstack()/np.hstack()
示例:
a = np.array([[1, 2], [3, 4]])

# 转置
print(a.T)  # [[1 3], [2 4]]

# 调整形状为 4x1
b = a.reshape(4, 1)

# 垂直堆叠
c = np.vstack([a, [[5, 6]]])  # 3x2 矩阵

3.3 聚合计算

  • 统计函数sum(), mean(), std(), min(), max()
  • 指定轴计算:通过 axis 参数控制计算方向(如 axis=0 按列计算)。
示例:
arr = np.array([[1, 2], [3, 4]])

print(np.sum(arr))       # 10(全局求和)
print(np.mean(arr, axis=0))  # [2. 3.](按列求均值)

4. 高级功能

4.1 线性代数

  • 矩阵乘法@np.dot()
  • 分解与求逆np.linalg.inv(), np.linalg.svd()
  • 行列式与特征值np.linalg.det(), np.linalg.eig()
示例:
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])

# 矩阵乘法
print(A @ B)  # [[19 22], [43 50]]

# 求逆矩阵
inv_A = np.linalg.inv(A)

4.2 内存布局与性能优化

  • 视图(View)与拷贝(Copy):视图共享数据,拷贝创建新内存。
  • 内存顺序:C 风格(行优先)或 Fortran 风格(列优先),通过 order 参数控制。
  • 预分配内存:避免频繁创建新数组。
示例:
# 创建 C 顺序数组(默认)
arr_c = np.array([[1, 2], [3, 4]], order='C')

# 创建 Fortran 顺序数组
arr_f = np.array([[1, 2], [3, 4]], order='F')

4.3 结构化数组

支持类似表格的异构数据类型(类似 pandas 的 DataFrame)。

示例:
# 定义结构化数据类型
dtype = [('name', 'S10'), ('age', 'i4'), ('score', 'f4')]
data = np.array([('Alice', 25, 89.5), ('Bob', 30, 92.0)], dtype=dtype)

# 按字段访问
print(data['name'])  # [b'Alice' b'Bob']

5. 性能对比

5.1 numpy vs 纯 Python

import time

# 纯 Python 列表求和
py_list = list(range(1_000_000))
start = time.time()
sum(py_list)
print("Python time:", time.time() - start)  # ~0.05s

# numpy 数组求和
np_arr = np.arange(1_000_000)
start = time.time()
np.sum(np_arr)
print("Numpy time:", time.time() - start)   # ~0.0005s

6. 与其他库的集成

  • pandasDataFrameSeries 底层使用 numpy 数组。
  • matplotlib:直接绘制 numpy 数组数据。
  • scipy:基于 numpy 提供科学计算高级函数(如信号处理、优化算法)。

7. 局限性

  • 同质数据类型:无法直接存储混合类型数据(需用结构化数组或 pandas)。
  • 动态性差:数组大小固定,动态增删元素成本高。

8. 安装与文档


掌握 numpy 后,可进一步学习 pandas(数据处理)和 scipy(科学计算),构建完整的数据分析工具链。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晴雨日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值