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

人工智能之数据分析 numpy

第七章 数组迭代排序筛选


文章目录

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

前言

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


一、数组迭代(Iteration)

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

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

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

python 复制代码
import numpy as np

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

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

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

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

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

python 复制代码
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. 同时迭代多个数组(广播兼容)

python 复制代码
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()

python 复制代码
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. 基础排序

python 复制代码
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. 多维排序(指定轴)

python 复制代码
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. 结构化数组排序(按字段)

python 复制代码
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. 布尔索引(最常用)

python 复制代码
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() 筛选索引

python 复制代码
# 返回满足条件的索引
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)

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

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

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

python 复制代码
# 创建结构化数组:姓名、数学、英语成绩
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.]

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

python 复制代码
# 模拟灰度图像(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 显式循环

python 复制代码
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》

相关推荐
ModestCoder_2 小时前
【学习笔记】Diffusion Policy for Robotics
论文阅读·人工智能·笔记·学习·机器人·强化学习·具身智能
ins_lizhiming2 小时前
华为昇腾910B服务器上部署Qwen3-30B-A3B并使用EvalScope推理性能测试
人工智能·华为
IT考试认证2 小时前
华为AI认证 H13-321 HCIP-AI V2.0题库
人工智能·华为·题库·hcip-ai·h13-321
热爱生活的五柒2 小时前
多模态遥感目标检测模型SM3Det:一站式多模态遥感目标检测!开启遥感检测新任务
人工智能·目标检测·计算机视觉·遥感·sm3det
ElfBoard3 小时前
ElfBoard技术贴|如何在【RK3588】ELF 2开发板上进行UART引脚复用配置
人工智能·单片机·嵌入式硬件·物联网
paperxie_xiexuo3 小时前
七款 AI PPT 工具新解:智能驱动演示升级,解锁多元创作场景
大数据·人工智能·powerpoint·大学生·ppt
大模型实验室Lab4AI4 小时前
VideoLLaMA 3新一代前沿多模态基础模型赋能图像与视频深度理解| LLM | 计算机视觉
人工智能·计算机视觉·音视频
还不秃顶的计科生4 小时前
如何快速用cmd知道某个文件夹下的子文件以及子文件夹的这个目录分支具体的分支结构
人工智能