news 2026/5/16 2:00:11

NumPy 使用指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
NumPy 使用指南

一、为什么选择 NumPy 而非 Python 列表

Python 原生列表(list)虽能存储数组形式的数据,但存在显著性能缺陷:

  • 内存效率低:列表存储的是对象指针,即使存储简单数值(如[0,1,2]),也需要额外存储指针,造成内存浪费;
  • 计算速度慢:列表元素分散存储,遍历需频繁查找内存地址,无法利用 CPU 矢量化指令;
  • 并行计算差:列表原生不支持多线程矩阵运算,难以利用多核 CPU 资源。

NumPy 解决了上述问题:

  • 数组元素存储在连续的内存块中,无需额外指针开销;
  • 支持 CPU 矢量化指令,计算效率远超列表;
  • 内置多线程矩阵运算,可充分利用硬件资源;
  • 核心逻辑基于 C 语言实现,避免 Python 解释器的性能损耗。

优化技巧:使用就地操作(如x *= 2)替代隐式拷贝(如y = x * 2),可使运算速度提升 2 倍以上。

二、NumPy 核心对象

NumPy 核心包含两个关键对象:

  • ndarray:N 维数组对象,用于存储多维数据;
  • ufunc:通用函数对象,用于对数组元素进行高效运算。

2.1 ndarray 多维数组

核心概念
  • 秩(rank):数组的维数,一维数组秩为 1,二维数组秩为 2;
  • 轴(axes):数组的维度方向,例如二维数组的axis=0代表列方向,axis=1代表行方向;
  • 属性shape(数组尺寸)、dtype(元素数据类型)。
创建基础数组
import numpy as np # 创建一维数组 a = np.array([1, 2, 3]) # 创建二维数组 b = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 修改数组元素(下标从 0 开始) b[1,1] = 10 # 查看数组属性 print("a 的尺寸:", a.shape) # 输出 (3,) print("b 的尺寸:", b.shape) # 输出 (3, 3) print("a 的数据类型:", a.dtype) # 输出 int32/int64(取决于系统) print("修改后的 b:\n", b)

输出结果

a 的尺寸: (3,) b 的尺寸: (3, 3) a 的数据类型: int32 修改后的 b: [[ 1 2 3] [ 4 10 6] [ 7 8 9]]
结构数组(自定义数据类型)

适用于存储结构化数据(如学生信息、商品信息),类似 C 语言的struct

import numpy as np # 定义结构类型:姓名(字符串)、年龄(整型)、语文/数学(整型)、英语(浮点型) persontype = np.dtype({ 'names': ['name', 'age', 'chinese', 'math', 'english'], 'formats': ['S32', 'i', 'i', 'i', 'f'] }) # 创建结构数组 peoples = np.array([ ("ZhangFei", 32, 75, 100, 90), ("GuanYu", 24, 85, 96, 88.5), ("ZhaoYun", 28, 85, 92, 96.5), ("HuangZhong", 29, 65, 85, 100) ], dtype=persontype) # 提取指定字段并计算平均值 ages = peoples[:]['age'] chineses = peoples[:]['chinese'] maths = peoples[:]['math'] englishs = peoples[:]['english'] print("平均年龄:", np.mean(ages)) print("平均语文成绩:", np.mean(chineses)) print("平均数学成绩:", np.mean(maths)) print("平均英语成绩:", np.mean(englishs))

输出结果

平均年龄: 28.25 平均语文成绩: 77.5 平均数学成绩: 93.25 平均英语成绩: 93.75

2.2 ufunc 通用函数

ufunc 是对数组元素进行批量操作的函数,基于 C 语言实现,运算速度极快。

1. 连续数组创建

函数

用法

说明

arange

np.arange(起始, 终止, 步长)

不包含终止值,生成等差数组

linspace

np.linspace(起始, 终止, 元素个数)

包含终止值,线性等分生成数组

示例:

import numpy as np x1 = np.arange(1, 11, 2) # 起始1,终止11(不含),步长2 x2 = np.linspace(1, 9, 5) # 起始1,终止9(含),生成5个元素 print("x1:", x1) # 输出 [1 3 5 7 9] print("x2:", x2) # 输出 [1 3 5 7 9]
2. 算术运算

支持数组间的加、减、乘、除、次方、取余等运算:

import numpy as np x1 = np.arange(1, 11, 2) x2 = np.linspace(1, 9, 5) print("加法:", np.add(x1, x2)) # [ 2. 6. 10. 14. 18.] print("减法:", np.subtract(x1, x2)) # [0. 0. 0. 0. 0.] print("乘法:", np.multiply(x1, x2)) # [ 1. 9. 25. 49. 81.] print("除法:", np.divide(x1, x2)) # [1. 1. 1. 1. 1.] print("次方:", np.power(x1, x2)) # [1.00000000e+00 2.70000000e+01 ...] print("取余:", np.remainder(x1, x2)) # [0. 0. 0. 0. 0.](也可用 np.mod)
3. 统计函数

函数

功能

示例(二维数组a = [[1,2,3],[4,5,6],[7,8,9]]

amin(a, axis)

计算指定轴的最小值

np.amin(a)→ 1;np.amin(a, 0)→ [1,2,3];np.amin(a,1)→ [1,4,7]

amax(a, axis)

计算指定轴的最大值

np.amax(a)→ 9;np.amax(a, 0)→ [7,8,9];np.amax(a,1)→ [3,6,9]

ptp(a, axis)

计算最大值与最小值的差(极差)

np.ptp(a)→ 8;np.ptp(a, 0)→ [6,6,6];np.ptp(a,1)→ [2,2,2]

percentile(a, p, axis)

计算第 p 百分位数(p∈[0,100])

np.percentile(a, 50)→ 5.0;np.percentile(a,50,0)→ [4,5,6]

median(a, axis)

计算中位数

np.median(a)→ 5.0;np.median(a,0)→ [4,5,6]

mean(a, axis)

计算算术平均值

np.mean(a)→ 5.0;np.mean(a,0)→ [4,5,6]

average(a, weights)

计算加权平均值

a=[1,2,3,4], wts=[1,2,3,4]→ 加权平均为 3.0

std(a)

计算标准差

a=[1,2,3,4]→ std≈1.118

var(a)

计算方差

a=[1,2,3,4]→ var=1.25

示例(加权平均):

import numpy as np a = np.array([1,2,3,4]) wts = np.array([1,2,3,4]) print("算术平均:", np.average(a)) # 2.5 print("加权平均:", np.average(a, weights=wts)) # 3.0
4. 排序

np.sort(a, axis, kind):默认快速排序(kind=quicksort),支持合并排序(mergesort)、堆排序(heapsort)。

  • axis=None:展平数组后整体排序;
  • axis=0:沿列排序;
  • axis=1:沿行排序(默认)。

示例:

import numpy as np a = np.array([[4,3,2],[2,4,1]]) print("默认排序(axis=1):\n", np.sort(a)) # [[2 3 4],[1 2 4]] print("展平排序:", np.sort(a, axis=None)) # [1 2 2 3 4 4] print("沿列排序(axis=0):\n", np.sort(a, axis=0)) # [[2 3 1],[4 4 2]] print("沿行排序(axis=1):\n", np.sort(a, axis=1)) # [[2 3 4],[1 2 4]]

三、核心总结

  1. NumPy 优势:相比 Python 列表,NumPy 数组内存连续、支持矢量化运算和多线程,计算效率大幅提升;
  2. 核心对象ndarray用于存储多维数组(支持自定义结构),ufunc用于数组的高效运算;
  3. 关键操作:掌握数组的创建、算术运算、统计分析(均值/方差/极差等)、排序,是 NumPy 应用的核心。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/16 1:56:46

谷歌搜索留痕怎么做? 解决URL不收录的3个代码细节

打开后台服务器日志文件,纯文本记录着Googlebot访问轨迹。2024年3月某外贸独立站生成150,000个带有搜索词参数的网页。Googlebot当日发起45,000次抓取请求,返回HTTP状态码200的网页占8%。剩余92%被系统标记未建立索引。服务器分配给单一域名的抓取预算用…

作者头像 李华
网站建设 2026/5/16 1:52:04

Python实现IPL拍卖模拟器:从事件驱动架构到策略建模

1. 项目概述:一个面向开发者的IPL拍卖模拟器如果你对板球,特别是印度超级联赛(IPL)感兴趣,同时又是一名开发者,那么你很可能想过:能不能自己动手写一个程序,来模拟那激动人心的球员拍…

作者头像 李华
网站建设 2026/5/16 1:51:08

【深度解析】Codex 集成 Ollama:在本地开源大模型上构建 AI 编程工作流

摘要 Codex 与 Ollama 的集成,让开发者可以在本地运行开源大模型,并将其接入 AI 编程助手工作流。本文围绕本地模型部署、Codex 调用、代码生成与审查场景展开,补充云端大模型 API 的工程化选型方案。背景介绍 AI Coding Agent 已经从“代码补…

作者头像 李华
网站建设 2026/5/16 1:51:07

基于PIC32 MCU的蓝牙音频系统开发:架构、实现与工程实践

1. 项目概述:为什么选择PIC32做蓝牙音频?在嵌入式音频开发领域,选型往往是项目成败的第一步。当项目需求指向“蓝牙音频”时,开发者面前会摆出几条主流路径:高集成度的专用蓝牙音频SoC(如杰理、恒玄的方案&…

作者头像 李华