人工智能之数据分析 numpy:第七章 数组迭代排序筛选

人工智能之数据分析 numpy

第七章 数组迭代排序筛选


@

目录
  • 人工智能之数据分析 numpy
  • 前言
  • 一、数组迭代(Iteration)
    • ⚠️ 原则:尽量避免显式 for 循环!优先使用向量化操作。
    • 1. 一维数组:直接 for 循环
    • 2. 多维数组:默认按第一维迭代(逐“行”)
    • 3. 逐元素迭代:np.nditer()
    • 4. 同时迭代多个数组(广播兼容)
    • 5. 获取索引:np.ndenumerate()
  • 二、排序(Sorting)——回顾与进阶
    • 1. 基础排序
    • 2. 多维排序(指定轴)
    • 3. 结构化数组排序(按字段)
  • 三、筛选(Filtering)——条件选择
    • 1. 布尔索引(最常用)
    • 2. 使用 np.where() 筛选索引
    • 3. 花式索引(Fancy Indexing)
  • 四、综合实战:迭代 + 排序 + 筛选
    • 📌 场景:处理学生成绩表(结构化数据)
    • 📌 场景:图像像素筛选与排序(二维数组)
  • 五、性能对比:向量化 vs 显式循环
  • 六、小结:最佳实践指南
  • 后续
  • 资料关注


前言

在 NumPy 中,数组的迭代、排序与筛选是数据处理中的三大基础操作。虽然 NumPy 强调​向量化操作​(避免显式 Python 循环以提升性能),但在某些场景下仍需对数组进行迭代(如逐行/逐元素处理)。本文将系统讲解这三类操作,并结合实际示例说明如何高效使用。


一、数组迭代(Iteration)

⚠️ 原则:尽量避免显式 for 循环!优先使用向量化操作。

但若必须迭代,NumPy 提供了多种方式:

1. 一维数组:直接 for 循环

import numpy as npa = np.array([1, 2, 3])
for x in a:print(x)  # 1, 2, 3

2. 多维数组:默认按第一维迭代(逐“行”)

b = np.array([[1, 2], [3, 4]])
for row in b:print(row)  # [1 2], [3 4]

3. 逐元素迭代:np.nditer()

适用于任意维度,内存高效(支持 C/Fortran 顺序)。

c = np.array([[1, 2], [3, 4]])# 只读迭代
for x in np.nditer(c):print(x, end=' ')  # 1 2 3 4# 可写迭代(修改原数组)
with np.nditer(c, op_flags=['readwrite']) as it:for x in it:x[...] = x * 2
print(c)  # [[2 4] [6 8]]

4. 同时迭代多个数组(广播兼容)

a = np.array([1, 2, 3])
b = np.array([10, 20, 30])for x, y in np.nditer([a, b]):print(x, y)  # (1,10), (2,20), (3,30)

5. 获取索引:np.ndenumerate()

d = np.array([[10, 20], [30, 40]])
for index, value in np.ndenumerate(d):print(index, value)
# (0,0) 10
# (0,1) 20
# (1,0) 30
# (1,1) 40

✅ ​最佳实践​:除非逻辑复杂无法向量化,否则不要用 for 循环处理 NumPy 数组!


二、排序(Sorting)——回顾与进阶

1. 基础排序

arr = np.array([3, 1, 4, 1, 5])# 返回排序后新数组
sorted_arr = np.sort(arr)# 原地排序
arr.sort()# 获取排序索引
indices = np.argsort(arr)  # [1 3 0 2 4]

2. 多维排序(指定轴)

mat = np.array([[3, 1], [2, 4]])# 按行排序(每行内部排)
np.sort(mat, axis=1)  # [[1 3], [2 4]]# 按列排序(每列内部排)
np.sort(mat, axis=0)  # [[2 1], [3 4]]

3. 结构化数组排序(按字段)

dt = np.dtype([('name', 'U10'), ('score', 'i4')])
students = np.array([('Alice', 85), ('Bob', 90), ('Charlie', 78)], dtype=dt)# 按 score 排序
sorted_students = np.sort(students, order='score')
print(sorted_students)  
# [('Charlie', 78) ('Alice', 85) ('Bob', 90)]

三、筛选(Filtering)——条件选择

1. 布尔索引(最常用)

data = np.array([10, 20, 30, 40, 50])# 单条件
filtered = data[data > 30]  # [40 50]# 多条件(注意括号!)
filtered = data[(data > 20) & (data < 50)]  # [30 40]# 非(not)
filtered = data[~(data == 30)]  # [10 20 40 50]

2. 使用 np.where() 筛选索引

# 返回满足条件的索引
indices = np.where(data > 30)  # (array([3, 4]),)
values = data[indices]         # [40 50]# 三元选择(类似 if-else)
result = np.where(data > 30, data, -1)  # [ -1  -1  -1  40  50]

3. 花式索引(Fancy Indexing)

# 按指定位置筛选
positions = [0, 2, 4]
selected = data[positions]  # [10 30 50]

四、综合实战:迭代 + 排序 + 筛选

📌 场景:处理学生成绩表(结构化数据)

# 创建结构化数组:姓名、数学、英语成绩
dt = np.dtype([('name', 'U10'), ('math', 'f4'), ('english', 'f4')])
scores = np.array([('Alice', 88, 92),('Bob', 75, 85),('Charlie', 95, 88),('Diana', 60, 90)
], dtype=dt)# 1️⃣ 筛选:找出数学 > 80 的学生
good_math = scores[scores['math'] > 80]
print("数学优秀:\n", good_math)# 2️⃣ 排序:按总分降序排列
total = scores['math'] + scores['english']
sorted_indices = np.argsort(-total)  # 负号实现降序
ranked = scores[sorted_indices]
print("排名:\n", ranked)# 3️⃣ 迭代:打印每位学生的总分(仅用于演示,实际应向量化)
print("总分列表:")
for student in scores:print(f"{student['name']}: {student['math'] + student['english']}")# ✅ 更高效写法(无循环):
print("总分(向量化):", scores['math'] + scores['english'])

输出:

数学优秀:[('Alice', 88., 92.) ('Charlie', 95., 88.)]
排名:[('Alice', 88., 92.) ('Charlie', 95., 88.) ('Bob', 75., 85.) ('Diana', 60., 90.)]
总分列表:
Alice: 180.0
Bob: 160.0
Charlie: 183.0
Diana: 150.0
总分(向量化): [180. 160. 183. 150.]

📌 场景:图像像素筛选与排序(二维数组)

# 模拟灰度图像(0~255)
img = np.random.randint(0, 256, size=(4, 4), dtype=np.uint8)
print("原图:\n", img)# 筛选:只保留亮度 > 128 的像素,其余设为0
bright_pixels = np.where(img > 128, img, 0)
print("高亮区域:\n", bright_pixels)# 排序:获取所有像素值的排序
flat_sorted = np.sort(img.ravel())
print("所有像素排序:", flat_sorted)# 迭代:统计每个灰度级出现次数(实际应用中用 np.bincount 更高效)
hist = np.zeros(256, dtype=int)
for pixel in np.nditer(img):hist[pixel] += 1
print("直方图(前10个):", hist[:10])

💡 实际图像处理中,应使用 np.histogram()cv2.calcHist(),而非手动迭代。


五、性能对比:向量化 vs 显式循环

large_arr = np.random.rand(1_000_000)# ✅ 向量化(快)
result_vec = large_arr[large_arr > 0.5]# ❌ 显式循环(慢)
result_loop = []
for x in large_arr:if x > 0.5:result_loop.append(x)

在 100 万数据上,向量化通常比 Python 循环快 ​10~100 倍​!


六、小结:最佳实践指南

操作 推荐方式 避免方式
迭代 np.nditer,np.ndenumerate(仅必要时) 普通 for 循环处理大数组
排序 np.sort,argsort,order(结构化) 手动实现排序算法
筛选 布尔索引、np.where 用循环逐个判断

🔑 ​核心思想​:​尽可能用 NumPy 内置函数替代 Python 循环​,以发挥其 C 语言底层优化的优势。


后续

本文主要讲述了numpy数组的迭代排序和筛选以及相关应用场景。python过渡项目部分代码已经上传至gitee,后续会逐步更新,主要受时间原因限制,当然自己也可以克隆到本地学习拓展。

资料关注

公众号:咚咚王
gitee:https://gitee.com/wy18585051844/ai_learning

《Python编程:从入门到实践》
《利用Python进行数据分析》
《算法导论中文第三版》
《概率论与数理统计(第四版) (盛骤) 》
《程序员的数学》
《线性代数应该这样学第3版》
《微积分和数学分析引论》
《(西瓜书)周志华-机器学习》
《TensorFlow机器学习实战指南》
《Sklearn与TensorFlow机器学习实用指南》
《模式识别(第四版)》
《深度学习 deep learning》伊恩·古德费洛著 花书
《Python深度学习第二版(中文版)【纯文本】 (登封大数据 (Francois Choliet)) (Z-Library)》
《深入浅出神经网络与深度学习+(迈克尔·尼尔森(Michael+Nielsen)》
《自然语言处理综论 第2版》
《Natural-Language-Processing-with-PyTorch》
《计算机视觉-算法与应用(中文版)》
《Learning OpenCV 4》
《AIGC:智能创作时代》杜雨+&+张孜铭
《AIGC原理与实践:零基础学大语言模型、扩散模型和多模态模型》
《从零构建大语言模型(中文版)》
《实战AI大模型》
《AI 3.0》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/974124.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AE文字动画

--本篇导航--字符段落文字动画预设(使用预设、制作自己的预设)文字动画效果参数介绍文字动画例子字符 在使用文字工具(Ctrl+T)输入文字时会自动打开【字符】面板。也可以在菜单栏【窗口】下手动打开。Alt + ←减小…

2025/11/23-Listening to music most days could lower dementia risks for older adults, study suggests

2025/11/23-Listening to music most days could lower dementia risks for older adults, study suggestsListening to music most days could lower dementia risks for older adults, study suggests p { line-heig…

完整教程:设计模式的底层原理——解耦

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

windows11资源管理器桌面文件夹从中文“桌面”变为应为“Desktop”的恢复方法

管理员打开命令行,执行命令: attrib +R "%UserProFile%\Desktop" 原文链接:https://learn.microsoft.com/zh-cn/answers/questions/2823684/desktop?forum=windows-all&referrer=answers

Oracle数据库核心操作完全手册:运维、开发与调优必备

Oracle数据库核心操作完全手册:运维、开发与调优必备在Oracle数据库的日常使用中,无论是实例管理、表操作、权限控制,还是性能调优、故障排查,都离不开一系列高频且关键的操作。本文整合了Oracle数据库从基础操作到…

2025/11/25

2025/11/25JDBC 操作数据库的完整流程: 加载数据库驱动 → DriverManager 获取 Connection(数据库连接)→ 通过 Connection 创建 Statement/PreparedStatement → 执行 SQL → 返回 ResultSet(查询结果)→ 关闭资…

完整教程:单体架构中的事件驱动架构:Java应用程序的渐进式重构

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025/11/26

2025/11/26事务 数据库中一组不可分割的操作集合,要么全部执行成功,要么全部执行失败(要么全做,要么全不做),核心是保证数据一致性。 核心特性(ACID) A(原子性):操作不可拆分,要么全成要么全回滚(如转账:…

TRUG如何验证随机性

在之前的项目中,也有使用外购的TRNG模块产生随机数,一般只验证集成、可以产生数据,并未对产生数据的随机性进行评估。 那么如何评估TRNG产生数据的随机性? 我们无法“证明”一个物理世界或算法生成的序列是绝对随即…

【网络】在windows下,使用自带的ftp服务器,并添加账户 - 指南

【网络】在windows下,使用自带的ftp服务器,并添加账户 - 指南2025-11-23 18:20 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !impo…

实用指南:JVM篇:一文读懂JVM:工作原理之核心技术解析

实用指南:JVM篇:一文读懂JVM:工作原理之核心技术解析pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&…

2025年西北地区软化水设备厂家选择指南,陕西、甘肃、新疆、宁夏四省首选西安紫云,行业口碑品质靠谱推荐

随着工业自动化升级与环保政策收紧,软化水设备作为工业用水处理的核心设备,市场需求持续攀升。本榜单基于技术专业性、行业适配性、服务覆盖力三大维度,结合2025年《中国全自动软化水行业市场前景预测报告》及产业调…

java geotiff的空间索引如何构建

在Java中,可以使用GeoTools库来处理GeoTIFF文件并构建空间索引。GeoTools是一个开源的Java GIS工具库,支持多种地理空间数据格式和空间索引算法。以下是使用GeoTools构建GeoTIFF空间索引的基本步骤:添加GeoTools依赖…

java for linux 安装

在 Linux 系统上安装 Java 通常可以通过以下几种方式完成:? 1. 使用官方仓库安装(推荐)方法一:使用 yum(适用于 CentOS/RHEL)sudo yum install java-11-openjdk方法二:使用 dnf(适用于 Fedora)sudo dnf inst…

【OI 复健计划】板子复习

已经菜到板子都敲不熟练了 >_<。 敲板子前发现自己已经忘记快输怎么写了,没救了(笑哭)。 bfs板子 来自信奥一本通 (唉,还是喜欢手写队列...该改改了) 传送门点击查看代码 #include<bits/stdc++.h> …

时间即生命 梁实秋

最令人怵目惊心的一件事,是看着钟表上的秒针一下一下的移动,每移动一下就是表示我们的寿命已经缩短了一部分。再看看墙上挂着的可以一张张撕下的日历,每天撕下一张就是表示我们的寿命又缩短了一天。因为时间即生命。…

AI元人文:当理论成为悬鉴 ——兼论独立思想者的现代困境

AI元人文:当理论成为悬鉴 ——兼论独立思想者的现代困境 当岐金兰最后一次关闭那篇无人问津的文稿时,她明白了一个残酷的真相:有些思想,注定要成为高悬于时代之上的明镜,而非铺就于脚下的台阶。 “AI元人文”这个…

2025年西北地区无动力无阀滤池水处理设备厂商怎么选?陕西甘肃新疆宁夏四省,优质品牌行业口碑选择指南

随着环保要求的不断提高和水资源短缺问题的日益突出,无动力无阀滤池水处理设备作为一种高效、节能的水处理解决方案,受到了市场的广泛关注。本榜单基于技术先进性、产品性能、应用案例和市场口碑四大维度,结合行业报…

2025西北地区反渗透一体机品牌怎么选?陕西、甘肃、新疆、宁夏四省多场景净水提纯设备源头工厂选择指南

随着环保政策的持续收紧和水处理技术的不断升级,反渗透一体机作为高效水质净化设备,在饮用水处理、污水处理及回用等领域发挥着越来越重要的作用。本榜单基于技术实力、产品性能、应用案例及服务体系四大维度,结合行…

Microsoft将.NET Aspire 改成了Aspire

Microsoft 于 11 月 11 日在 .NET Conf 2025 期间宣布了 Aspire 13,称其为其分布式应用开发框架迄今为止最大规模的发布。它还去掉了名称中的“.NET”部分,显然是为了反映更广泛的语言支持和抽象。不过微软公司尚未对…