AI科学计算工具系列——(一)Numpy中的高级索引

NumPy 比一般的 Python 序列提供更多的索引方式。除了基本的用整数和切片的索引外,数组可以由整数数组索引布尔索引花式索引

整数数组索引

(一)一维数组的索引

import numpy as np 
 
x = np.array([[1,  2],  [3,  4],  [5,  6]]) 
print("原数组为:")
print(x)
#行索引为[0,1,2],列索引为[0,1,0]
y = x[[0,1,2],  [0,1,0]] 
#x[[0,1,2],  [0,1,0]]等价于:取出x中(0,0),(1,1),(2,0)位置的元素
#索引数组为[[0,0],[1,1],[2,0]]
print ("索引结果:")
print (y)
原数组为:
[[1 2]
 [3 4]
 [5 6]]
索引结果:
[1 4 5]

以上实例获取数组中(0,0),(1,1)和(2,0)位置处的元素。

(二)二维数组的索引

import numpy as np 
 
x = np.array([[0,1,2],[3,4,5],[6,7,8],[9,10,11]])
print ("原数组为:")
print (x)
#行索引为[[0,0],[3,3]],列索引为[[0,2],[0,2]]
rows = np.array([[0,0],[3,3]]) 
cols = np.array([[0,2],[0,2]]) 
y = x[rows,cols]  
#索引数组为[[0,0],[0,2],
#           [3,0],[3,2]]
print  ("索引结果:")
print (y)
原数组为:
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]
索引结果:
[[ 0  2]
 [ 9 11]]

(三)切片索引

import numpy as np
 
a = np.array([[1,2,3], [4,5,6],[7,8,9]])
b = a[1:3, 1:3]
print("切片索引:")
print(b)
c = a[1:3,[1,2]]
print("切片索引+列表列索引:")
print(c)
d = a[...,1:]
print("...索引:")
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)
# 现在我们会打印出大于 5 的元素  
print("布尔索引结果:")
print(x[x>5])
原数组为:
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]
布尔索引结果:
[ 6  7  8  9 10 11]

选去数组中不等于0的元素:

import numpy as np 
 
x = np.array([0,1,2,0,3,4,0,5])  
print (x[x!=0])
[1 2 3 4 5]

(一)一维数组的索引

布尔数组中,下标为0,3,4的位置是True,因此将会取出目标数组中对应位置的元素。

import numpy as np 

x=np.arange(7)
print ("原数组为:")
print (x)
boolean= np.array([True,False,False,True,True,False,False])
print("索引结果:")
print(x[boolean])
原数组为:
[0 1 2 3 4 5 6]
索引结果:
[0 3 4]

(二)二维数组的索引

布尔数组中,下标为0,3,4的位置是True,因此将会取出目标数组中第0,3,4行。

import numpy as np 

x=np.arange(28).reshape((7,4))
print ("原数组为:")
print (x)
boolean=np.array([True,False,False,True,True,False,False])
#布尔数组的维度要与原数组的维度相同
print("索引结果:")
print(x[boolean])
原数组为:
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]
 [16 17 18 19]
 [20 21 22 23]
 [24 25 26 27]]
索引结果:
[[ 0  1  2  3]
 [12 13 14 15]
 [16 17 18 19]]

花式索引

花式索引指的是利用整数数组进行索引。

花式索引根据索引数组的值作为目标数组的某个轴的下标来取值。对于使用一维整型数组作为索引,如果目标是一维数组,那么索引的结果就是对应位置的元素;如果目标是二维数组,那么就是对应下标的行。

花式索引跟切片不一样,它总是将数据复制到新数组中。

(一)一维数组的花式索引

import numpy as np 

x=np.array(['0','1','2','3','4'])
print ("原数组为:")
print (x)
print("索引结果:")
print(x[[1,4]])
原数组为:
['0' '1' '2' '3' '4']
索引结果:
['1' '4']

(二)二维数组的花式索引

import numpy as np 
 
x=np.empty((8,4),dtype=np.int)
for i in range(8):
    x[i]=i
print ("原数组为:")
print (x)
print("索引结果1:")
print(x[[4,3,0,6]])
print("索引结果2:")
print(x[[-3,-5,-7]])
原数组为:
[[0 0 0 0]
 [1 1 1 1]
 [2 2 2 2]
 [3 3 3 3]
 [4 4 4 4]
 [5 5 5 5]
 [6 6 6 6]
 [7 7 7 7]]
索引结果1:
[[4 4 4 4]
 [3 3 3 3]
 [0 0 0 0]
 [6 6 6 6]]
索引结果2:
[[5 5 5 5]
 [3 3 3 3]
 [1 1 1 1]]

对于使用两个整型数组作为索引的时候,那么结果是按照顺序取出对应轴的对应下标的值。特别注意,这两个整型数组的shape应该一致,或者其中一个数组应该是长度为1的一维数组(与NumPy的Broadcasting机制于关系)。例如,以[1,3,5],[2,4,6]这两个整型数组作为索引,那么对于二维数组,则取出(1,2),(3,4),(5,6)这些坐标对应的元素。

x=np.arange(42).reshape(6,7)
print ("原数组为:")
print (x)
print("索引结果:")
print(x[[1,3,5],[2,4,6]])
原数组为:
[[ 0  1  2  3  4  5  6]
 [ 7  8  9 10 11 12 13]
 [14 15 16 17 18 19 20]
 [21 22 23 24 25 26 27]
 [28 29 30 31 32 33 34]
 [35 36 37 38 39 40 41]]
索引结果:
[ 9 25 41]

结果与整数数组索引的相同

传入多个索引数组(要使用np.ix_)

import numpy as np 
 
x=np.arange(32).reshape((8,4))
#np.ix_()里扔进两个一维数组[1,5,7,2],[0,3,1,2],就能先按我们要求选取行,再按顺序将列排序
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 高级索引 | 菜鸟教程 打开链接
Numpy的布尔索引与花式索引 - 简书 打开链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值