NumPy 中文教程

第一部分:基础认知与环境准备
第 1 章 全面认识 NumPy
第 2 章 开发环境搭建与验证
第二部分:核心对象 ——ndarray 数组
第 3 章 ndarray 数组基础
第 4 章 数组的形状与维度操作
第四部分:高级应用与数据处理
第 8 章 数组的排序、查找与去重
第 9 章 缺失值与异常值处理
第 10 章 随机数生成与抽样
第 11 章 文件读写与数据交互
第五部分:实战场景与落地应用
第 12 章 数值计算实战
第 13 章 数据分析实战
第六部分:优化进阶与问题解决
第 14 章 NumPy 性能优化
第 15 章 NumPy 进阶扩展
第 16 章 常见问题与解决方案

5.1 一维数组索引与切片

NumPy一维数组索引与切片完整教程:从基础索引到高级筛选详解

NumPy 中文教程

本教程详细讲解NumPy一维数组的索引与切片方法,包括基本索引(整数和切片)、布尔索引、花式索引、高级筛选,以及索引返回视图或副本的规则,适合新人学习,代码示例丰富易懂。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

NumPy一维数组索引与切片教程

引言

NumPy是Python数据科学的核心库,它提供了高效的多维数组操作。索引和切片是访问数组数据的基本方式,掌握这些技巧能显著提升数据处理的效率。本教程将深入探讨一维数组的索引与切片,从基础概念到高级应用,帮助新人快速上手。

1. 基本索引

基本索引允许我们通过位置或范围访问数组元素。它分为整数索引和切片索引两种形式。

整数索引

整数索引通过指定元素的位置来访问单个元素。NumPy数组索引从0开始。

import numpy as np

# 创建一个一维数组
arr = np.array([10, 20, 30, 40, 50])
print('数组:', arr)

# 整数索引:访问第一个元素(索引0)
print('第一个元素:', arr[0])  # 输出: 10

# 访问第三个元素(索引2)
print('第三个元素:', arr[2])  # 输出: 30

# 负数索引:访问最后一个元素
print('最后一个元素:', arr[-1])  # 输出: 50

# 越界访问会抛出IndexError,例如 arr[10]

切片索引

切片索引使用 start:stop:step 语法访问连续的子数组,类似Python列表切片。

# 切片索引:获取索引1到3(不包括3)的元素
print('切片[1:3]:', arr[1:3])  # 输出: [20, 30]

# 省略start和stop:从头或到尾
print('从开始到索引2:', arr[:2])  # 输出: [10, 20]
print('从索引2到结束:', arr[2:])  # 输出: [30, 40, 50]

# 使用步长:每2个元素取一个
print('步长为2:', arr[::2])  # 输出: [10, 30, 50]

# 反向切片:反转数组
print('反转数组:', arr[::-1])  # 输出: [50, 40, 30, 20, 10]

# 切片索引总是返回一个新数组,不影响原数组(这将在视图与副本部分讨论)

2. 布尔索引

布尔索引允许我们根据条件筛选数组元素。它使用布尔数组来选择满足条件的元素。

# 创建一个一维数组
arr = np.array([1, 2, 3, 4, 5, 6])

# 创建一个布尔数组,表示条件(例如,元素大于3)
condition = arr > 3
print('条件数组:', condition)  # 输出: [False, False, False, True, True, True]

# 使用布尔索引筛选元素
filtered_arr = arr[condition]
print('筛选后的数组:', filtered_arr)  # 输出: [4, 5, 6]

# 直接使用布尔表达式进行索引
print('直接索引 arr[arr > 3]:', arr[arr > 3])  # 输出: [4, 5, 6]

# 复杂条件:多个条件组合
print('元素大于2且小于5:', arr[(arr > 2) & (arr < 5)])  # 输出: [3, 4]
# 注意:使用 &、| 等逻辑运算符时,需要用括号分组,避免Python语法错误

3. 花式索引

花式索引(或整数数组索引)使用整数数组来访问非连续的元素或多个元素。它比基本索引更灵活。

# 花式索引:使用整数数组指定索引位置
indices = np.array([0, 2, 4])  # 选择索引0、2、4的元素
print('花式索引结果:', arr[indices])  # 输出: [1, 3, 5]

# 花式索引可以用于重新排序或重复元素
reorder_indices = np.array([4, 0, 2])
print('重新排序:', arr[reorder_indices])  # 输出: [5, 1, 3]

# 使用Python列表作为索引也有效
list_indices = [1, 3, 5]
print('使用列表索引:', arr[list_indices])  # 输出: [2, 4, 6]

# 花式索引返回一个新数组,通常是副本

4. 高级筛选

高级筛选结合多种索引方法,实现更复杂的数据访问。这可以包括混合使用布尔索引和花式索引。

# 示例:结合布尔和花式索引
# 假设我们要筛选出偶数,然后选择特定位置
arr = np.array([10, 15, 20, 25, 30, 35])

# 首先使用布尔索引筛选偶数
even_arr = arr[arr % 2 == 0]
print('偶数数组:', even_arr)  # 输出: [10, 20, 30]

# 然后使用花式索引选择第一个和最后一个偶数
even_indices = np.array([0, 2])
print('特定偶数:', even_arr[even_indices])  # 输出: [10, 30]

# 直接组合:布尔条件后接花式索引(较少用,但可行)
# 但更常见的是分步进行,以提高可读性

5. 视图与副本的规则

在NumPy中,索引操作可能返回视图(view)或副本(copy),理解这一点对内存管理和数据修改至关重要。

  • 视图:是原数组的引用,修改视图会影响原数组。
  • 副本:是原数组的完整复制,修改副本不影响原数组。

规则:

  1. 基本索引(整数索引):返回一个标量(不是视图或副本),因为它是单个元素。
  2. 切片索引:默认返回视图,但如果指定了所有切片参数(如 arr[:]),或步长为1且范围连续,通常返回视图。
    • 在某些情况下,如非连续切片或复杂操作,NumPy可能自动创建副本以避免意外修改。
  3. 布尔索引和花式索引:总是返回副本,因为它们创建新的数组对象。

代码示例:

arr = np.array([1, 2, 3, 4, 5])

# 切片索引返回视图
view_slice = arr[1:4]
view_slice[0] = 100
print('原数组(修改视图后):', arr)  # 输出: [1, 100, 3, 4, 5]

# 验证视图特性
print('视图数组:', view_slice)  # 输出: [100, 3, 4]

# 布尔索引返回副本
copy_bool = arr[arr > 2]
copy_bool[0] = 200
print('原数组(修改副本后):', arr)  # 原数组未变: [1, 100, 3, 4, 5]
print('副本数组:', copy_bool)  # 输出: [200, 4, 5]

# 花式索引返回副本
copy_fancy = arr[[0, 2]]
copy_fancy[0] = 300
print('原数组(修改花式索引副本后):', arr)  # 原数组未变: [1, 100, 3, 4, 5]

# 如何显式创建副本
copy_explicit = arr.copy()
copy_explicit[0] = 999
print('显式副本:', copy_explicit)  # 输出: [999, 100, 3, 4, 5]
print('原数组:', arr)  # 原数组未变: [1, 100, 3, 4, 5]

实践建议:

  • 如果不想修改原数据,使用副本或显式调用 .copy()
  • 在性能关键场景,尽量使用视图以减少内存占用。

总结

本教程覆盖了NumPy一维数组索引与切片的所有关键方面:从基本的整数和切片索引,到布尔索引的条件筛选,再到花式索引的灵活访问,并深入探讨了视图与副本的规则。掌握这些内容后,您将能高效地处理数组数据,避免常见错误。建议多练习代码示例,加深理解。NumPy索引是数据科学的基础,熟练运用能显著提升工作效率。


扩展学习

  • 探索多维数组索引(类似但更复杂)。
  • 参考NumPy官方文档了解更多高级功能。

通过本教程,希望您能快速上手NumPy索引,并应用于实际项目中。

开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包