NumPy高级索引与数组比较实战指南

Oliver
Oliver
发布时间:2026-10-14| 5人浏览过
原创

本文深入解析NumPy中的Fancy Indexing(高级索引)机制,涵盖一维与二维数组的索引技巧,并详细阐述数组间的比较运算。通过具体代码示例,展示如何利用布尔数组进行元素筛选、统计计数及条件过滤,帮助开发者高效处理数值数据。

NumPy高级索引基础

在NumPy库中,Fancy Indexing(高级索引)是一种强大的数据访问方式,允许通过数组或列表形式的索引器来选取元素,而非仅依赖整数切片。

一维数组的高级索引应用


import numpy as np
 
#Fancy Indexing
x = np.arange(16)
np.random.shuffle(x)
print(x) #打印所有的元素
 
 
print(x[2])#获取某个元素的值
print(x[1:3])#切片
print(x[3:9:2])#指定间距切片
 
index = [2,4,7,9] #索引数组
print(x[index])#获取索引数组中的元素的值
 
ind = np.array([[0,2],[1,4]]) #索引二维数组
print(x[ind])##获取索引二维数组中的元素的值
 
print("---------------------")
 
X = x.reshape(4,-1)
print(X)
 
ind1 = np.array([1,3]) #行的索引
ind2 = np.array([2,0]) #列的索引
print(X[ind1,ind2])
 
print(X[:-2,ind2])
 
bool_index = [True,False,True,False] #True就取当前列,False就不取
print(X[:-1,bool_index])

对于一维数组,Fancy Indexing的表现尤为直观。首先创建一个包含16个元素的随机排列数组x,可以通过指定具体的索引列表如[2, 4, 7, 9]来直接获取对应位置的元素值。此外,还可以使用二维索引数组ind = np.array([[0,2],[1,4]])来构建更复杂的索引结构,此时x[ind]将返回由这些索引值组成的新数组,其形状与ind保持一致。

二维数组的交叉索引与切片


x = np.arange(16) 
x[3] # 3
x[3:9] # array([3, 4, 5, 6, 7, 8])
x[3:9:2] # array([3, 5, 7])
[x[3], x[5], x[7]] # [3, 5, 7]
ind = [3, 5, 7] 
x[ind]  # array([3, 5, 7])
ind = np.array([[0, 2], [1, 3]]) 
x[ind] 
"""
array([[0, 2],
    [1, 3]])
"""

当Fancy Indexing应用于二维数组时,逻辑稍显复杂但功能更强大。假设将一维数组x重塑为4行多列的二维数组X,可以通过分别定义行索引ind1和列索引ind2来实现精准定位。例如,X[ind1, ind2]会选取由ind1指定的行和ind2指定的列交叉点上的元素。同时,支持混合使用切片与索引,如X[:-2, ind2]选取除最后两行之外的指定列元素。此外,利用布尔列表bool_index = [True, False, True, False]进行列过滤,仅保留True对应的列,也是常用的操作技巧。

数组比较与布尔过滤实战


X = x.reshape(4, -1) 
"""
array([[ 0, 1, 2, 3],
    [ 4, 5, 6, 7],
    [ 8, 9, 10, 11],
    [12, 13, 14, 15]])
"""
row = np.array([0, 1, 2]) 
col = np.array([1, 2, 3])
# 1行2列,2行3列,3行4列
X[row, col]  # array([ 1, 6, 11])
# 前2行 2,3,4列
X[:2, col] 
"""
array([[1, 2, 3],
    [5, 6, 7]])
"""
col = [True, False, True, True] 
X[0, col]  # array([0, 2, 3])

数组比较是NumPy中的另一核心功能,支持逐元素的数学运算与逻辑判断。对数组x执行x < 3、x == 3或x != 3等比较操作,返回的是与原数组形状相同的布尔数组,其中满足条件的元素对应位置为True,否则为False。基于这些布尔数组,可以进一步进行统计与分析:np.sum(x<3)计算小于3的元素个数;np.any(x==0)判断数组中是否存在0元素;np.all(x==0)则验证是否所有元素均为0。在二维数组X中,这些操作同样适用,且支持指定轴(axis)进行聚合计算,如np.sum(X<4, axis=1)统计每行中小于4的元素数量。通过逻辑运算符&(与)、|(或)和~(非),可以构建复合条件,例如np.sum((X>3)&(X<10))统计介于3和10之间的元素个数,或np.sum(~(X==0))统计非零元素个数。最后,利用布尔索引如X[X[:,3]%3==0,:],可根据特定列的条件筛选出完整的行数据。

统计分析与条件筛选技巧


import numpy as np
 
x = np.arange(16)
print(x)
 
print(x < 3) #返回的是bool数组
 
print(x == 3)
 
print(x != 3)
 
print(x * 4 == 24 - 4 * x)
 
 
 
print(x + 1)
 
print(x * 2)
 
print(x / 4)
 
print(x - 10)
 
print(np.sum(x<3))#返回小于3的元素个数
 
print(np.any(x==0)) #只要向量x中有等于0的就返回true
 
print(np.all(x==0)) #只有向量x中全部等于0才返回true
 
print(x[x<5]) #因为x<5返回的是bool数组,我们取true的元素的值
 
 
#二维的同样支持
print("----------------------")
X = x.reshape(4,-1)
 
print(X)
print(X<3)
print(x == 3)
print(np.sum(X<4))
print(np.count_nonzero(X<5)) #返回X中小于5的不等于0的个数
print(np.any(X==0)) #只要向量x中有等于0的就返回true
 
print(np.all(X==0)) #只有向量x中全部等于0才返回true
 
print(np.sum(X<4,axis=1))#沿着列的方向,计算每行小于4的个数
 
print(np.sum((X>3)&(X<10))) #计算X中大于3并且小于10的个数
 
print(np.sum(~(X==0))) #计算X中不等于0的个数
 
print(X[X[:,3]%3==0,:]) #因为X[:,3]%3==0返回的是一个向量,元素为true,false,false,true,所以最后取第一行和最后一行

至此,关于NumPy中Fancy Indexing和array比较的详细解析已完成。通过掌握高级索引与数组比较技巧,可以更灵活地处理复杂的数据筛选与变换任务。如需了解更多相关内容,建议查阅本站过往文章或继续浏览后续更新,感谢支持!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。