NumPy高级索引与数组比较实战指南
本文深入解析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比较的详细解析已完成。通过掌握高级索引与数组比较技巧,可以更灵活地处理复杂的数据筛选与变换任务。如需了解更多相关内容,建议查阅本站过往文章或继续浏览后续更新,感谢支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









