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
posted @ 2020-01-20 12:47  Super~me  阅读(631)  评论(0编辑  收藏  举报