深入解析NumPy高级索引:整数、布尔与花式索引实战
本文深入解析NumPy的高级索引机制,涵盖整数数组索引、布尔索引及花式索引三大核心类型。通过具体代码示例,展示如何利用整数数组获取特定位置元素、使用布尔运算过滤数据(如NaN处理),以及通过np.ix_实现多维数组的复杂切片。掌握这些技巧可显著提升数据处理效率与灵活性。
NumPy高级索引概述
相较于标准Python序列,NumPy提供了更为丰富的索引方式。除了基础的整数索引和切片操作外,NumPy支持通过整数数组、布尔数组以及花式索引来访问和处理数组元素。
整数数组索引实战
整数数组索引
以下示例演示如何获取数组中坐标为(0,0)、(1,1)和(2,0)位置的元素值。
import numpy as np
x = np.array([[1, 2], [3, 4], [5, 6]])
y = x[[0,1,2], [0,1,0]]
print (y)
运行上述代码后的输出结果如下:
[1 4 5]
接下来,我们展示如何从一个4x3的数组中提取四个角落的元素。具体操作中,行索引数组设定为[0,0]和[3,3],列索引数组设定为[0,2]和[0,2]。
import numpy as np
x = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]])
print ('我们的数组是:' )
print (x)
print ('\n')
rows = np.array([[0,0],[3,3]])
cols = np.array([[0,2],[0,2]])
y = x[rows,cols]
print ('这个数组的四个角元素是:')
print (y)
该操作的输出结果如下:
原始数组内容如下: [[ 0 1 2] [ 3 4 5] [ 6 7 8] [ 9 10 11]]
提取出的四个角元素构成的数组如下: [[ 0 2] [ 9 11]]
最终返回的结果是一个包含每个角元素的ndarray对象。
在实际应用中,可以将切片符号:或省略号…与索引数组结合使用。具体示例如下:
import numpy as np
a = np.array([[1,2,3], [4,5,6],[7,8,9]])
b = a[1:3, 1:3]
c = a[1:3,[1,2]]
d = a[...,1:]
print(b)
print(c)
print(d)
执行上述代码后的输出结果如下:
[[5 6] [8 9]] [[5 6] [8 9]] [[2 3] [5 6] [8 9]]
布尔索引与数据过滤
布尔索引
我们可以利用一个布尔数组对目标数组进行索引操作。
布尔索引的核心机制是通过布尔运算(例如比较运算符)筛选出符合特定条件的元素,并返回对应的数组。
以下示例展示了如何筛选出数值大于5的元素:
import numpy as np
x = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]])
print ('我们的数组是:')
print (x)
print ('\n')
# 现在我们会打印出大于 5 的元素
print ('大于 5 的元素是:')
print (x[x > 5])
该操作的输出结果如下:
原始数组内容如下: [[ 0 1 2] [ 3 4 5] [ 6 7 8] [ 9 10 11]]
筛选出的大于5的元素结果如下: [ 6 7 8 9 10 11]
此外,以下示例演示了如何使用取补运算符~来过滤数组中的NaN值。
import numpy as np
a = np.array([np.nan, 1,2,np.nan,3,4,5])
print (a[~np.isnan(a)])
该操作的输出结果如下:
[ 1. 2. 3. 4. 5.]
另一个示例展示了如何从数组中过滤掉非复数元素。
import numpy as np
a = np.array([1, 2+6j, 5, 3.5+5j])
print (a[np.iscomplex(a)])
运行后的输出结果如下:
[2.0+6.j 3.5+5.j]
花式索引机制与应用
花式索引
花式索引(Fancy Indexing)是指利用整数数组进行索引的技术。
花式索引依据索引数组中的值作为目标数组特定轴的下标来提取数据。当目标为一维数组时,索引结果即为对应位置的元素;若目标为二维数组,则提取对应下标所指向的行。
需要注意的是,花式索引与切片不同,它始终会将数据复制到新的数组中,而非返回视图。
1、传入顺序索引数组
import numpy as np
x=np.arange(32).reshape((8,4))
print (x[[4,2,1,7]])
执行上述代码后的输出结果如下:
[[16 17 18 19] [ 8 9 10 11] [ 4 5 6 7] [28 29 30 31]]
2、传入倒序索引数组
import numpy as np
x=np.arange(32).reshape((8,4))
print (x[[-4,-2,-1,-7]])
执行上述代码后的输出结果如下:
[[16 17 18 19] [24 25 26 27] [28 29 30 31] [ 4 5 6 7]]
3、传入多个索引数组(需使用np.ix_)
import numpy as np
x=np.arange(32).reshape((8,4))
print (x[np.ix_([1,5,7,2],[0,3,1,2])])
执行上述代码后的输出结果如下:
[[ 4 7 5 6] [20 23 21 22] [28 31 29 30] [ 8 11 9 10]]
以上即为对NumPy高级索引的详细介绍,更多相关技术内容欢迎查阅本站其他文章。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









