NumPy教程:高级索引(整数和布尔值)

2018-09-2710:23:00后端程序开发Comments2,784 views字数 1564阅读模式

如果一个ndarray是非元组序列,数据类型为整数或布尔值的ndarray,或者至少一个元素为序列对象的元组,我们就能够用它来索引ndarray。高级索引始终返回数据的副本。 与此相反,切片只提供了一个视图。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5880.html

numpy中有两种类型的高级索引:整数和布尔值。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5880.html

整数索引

这种机制有助于基于 N 维索引来获取数组中任意元素。 每个整数数组表示该维度的下标值。 当索引的元素个数就是目标ndarray的维度时,会变得相当直接。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5880.html

以下示例获取了ndarray对象中每一行指定列的一个元素。 因此,行索引包含所有行号,列索引指定要选择的元素。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5880.html

示例 1

import numpy as np 

x = np.array([[1,  2],  [3,  4],  [5,  6]]) 
y = x[[0,1,2],  [0,1,0]]  
print y

输出如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5880.html

[1  4  5]

该结果包括数组中(0,0)(1,1)(2,0)位置处的元素。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5880.html

下面的示例获取了 4X3 数组中的每个角处的元素。 行索引是[0,0][3,3],而列索引是[0,2][0,2]文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5880.html

示例 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

输出如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5880.html

我们的数组是:                                                                 
[[ 0  1  2]                                                                   
 [ 3  4  5]                                                                   
 [ 6  7  8]                                                                   
 [ 9 10 11]]

这个数组的每个角处的元素是:                                      
[[ 0  2]                                                                      
 [ 9 11]]

返回的结果是包含每个角元素的ndarray对象。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5880.html

高级和基本索引可以通过使用切片:或省略号...与索引数组组合。 以下示例使用slice作为列索引和高级索引。 当切片用于两者时,结果是相同的。 但高级索引会导致复制,并且可能有不同的内存布局。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5880.html

示例 3

import numpy as np 
x = np.array([[  0,  1,  2],[  3,  4,  5],[  6,  7,  8],[  9,  10,  11]])  
print  '我们的数组是:'  
print x 
print  '\n'  
# 切片
z = x[1:4,1:3]  
print  '切片之后,我们的数组变为:'  
print z 
print  '\n'  
# 对列使用高级索引 
y = x[1:4,[1,2]] 
print  '对列使用高级索引来切片:'  
print y

输出如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5880.html

我们的数组是:
[[ 0  1  2] 
 [ 3  4  5] 
 [ 6  7  8]
 [ 9 10 11]]

切片之后,我们的数组变为:
[[ 4  5]
 [ 7  8]
 [10 11]]

对列使用高级索引来切片:
[[ 4  5]
 [ 7  8]
 [10 11]]

布尔索引

当结果对象是布尔运算(例如比较运算符)的结果时,将使用此类型的高级索引。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5880.html

示例 1

这个例子中,大于 5 的元素会作为布尔索引的结果返回。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5880.html

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]

输出如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5880.html

我们的数组是:
[[ 0  1  2] 
 [ 3  4  5] 
 [ 6  7  8] 
 [ 9 10 11]] 

大于 5 的元素是:
[ 6  7  8  9 10 11]

示例 2

这个例子使用了~(取补运算符)来过滤NaN文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5880.html

import numpy as np 
a = np.array([np.nan,  1,2,np.nan,3,4,5])  
print a[~np.isnan(a)]

输出如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5880.html

[ 1.   2.   3.   4.   5.]

示例 3

以下示例显示如何从数组中过滤掉非复数元素。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5880.html

import numpy as np 
a = np.array([1,  2+6j,  5,  3.5+5j])  
print a[np.iscomplex(a)]

输出如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5880.html

[2.0+6.j  3.5+5.j]
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5880.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/bc/5880.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定