NumPy切片和索引
类似于python中的list的切片操作,ndarray的对象也可以通过索引或者切片来操作。
通过slice函数设置其start stop 及step来切出一个新的数组。
如对数组a进行切割:
# 数组切割 slice av=np.arange(20); aq=slice(5,16,1) print(av[aq])
运行结果:
[ 5 6 7 8 9 10 11 12 13 14 15] Process finished with exit code 0
出来使用slice以为我们也可以使用冒号来分割实现切割
aq=av[5:16:1]
输出aq与上面运行结果一样
冒号解释:如果只放置一个参数,如 [2],将返回与该索引相对应的单个元素。如果为 [2:],表示从该索引开始以后的所有项都将被提取。如果使用了两个参数,如 [2:7],那么则提取两个索引(不包括停止索引)之间的项。
a = np.arange(10)
print(a[2:])
运行结果:
[2 3 4 5 6 7 8 9] Process finished with exit code 0
切片还可以包含省略号... ,主要用来选择列和行如:
a = np.array([[1,2,3],[3,4,5],[4,5,6]]) print (a[...,1]) # 第2列元素 print (a[1,...]) # 第2行元素 print (a[...,1:]) # 第2列及剩下的所有元素
运行结果:
[2 4 5] [3 4 5] [[2 3] [4 5] [5 6]] Process finished with exit code 0
高级索引
通过以下实例找出(0,0),(1,1),(0,1)三个元素,其中[[0,1,0],[0,1,1]]就对应三个元素的坐标:
# 高级索引 xg=np.array([[1,2],[3,4],[5,6]]) xy=xg[[0,1,0],[0,1,1]] print(xy)
运行结果:
[1 4 2] Process finished with exit code 0
下边来看下综合运用:
# 综合运用: ... az=np.array([[1,2,3],[4,5,6],[7,8,9]]) ab=az[1:3,1:3] ac=az[1:3,[1,0]] ad=az[...,1:] print('ab: ') print(ab) print('ac: ') print(ac) print('ad: ') print(ad)
运行结果:
ab: [[5 6] [8 9]] ac: [[5 4] [8 7]] ad: [[2 3] [5 6] [8 9]] Process finished with exit code 0
解释: ab的值就是([1,2],[1,2]) 的坐标点 ac的值就是([1,2],[1,0])的坐标点 ad的值就是([0,1,2],[1,2])的坐标点。
布尔索引
通过布尔运算也就是比较运算来获取符合条件的元素数组。
例如对于 x = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]])
我i们获取大于6的元素值:print(x[x>6])
另外~(取补运算符)可以用来过滤NaN
# 过滤· ~ ap=np.array([np.nan,3,12,np.nan]) print(ap[~np.isnan(ap)])
运行结果:
[ 3. 12.] Process finished with exit code 0
类似的还可以过滤掉非复数元素如:ap[np.iscomplex(ap)
花式索引
是利用整数数组来进行索引
x=np.arange(32).reshape((8,4))
print (x[[0,3,5],...])
运行结果:
[[ 0 1 2 3]
[12 13 14 15]
[20 21 22 23]]
或者使结果倒序改下代码为
x=np.arange(32).reshape((8,4))
print (x[[-0,-3,-5],...])
我们也可以使用np.ix_函数来产生笛卡尔积的映射效果 如下:
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]] Process finished with exit code 0