Code前端首页关于Code前端联系我们

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

terry 2年前 (2023-09-25) 阅读数 46 #后端开发

如果 ndarray 是非元组序列,则数据类型为整数或布尔值 ♽♽ 至少一个,或者♽ 元素是序列 A tuple 对象,我们可以用它来索引 ndarray。高级索引始终返回数据的副本。相反,切片仅提供单个视图。

numpy 中有两种高级索引类型:整数和布尔值。

整数索引

此机制有助于基于 N 维索引检索数组中的任何元素。每行整数代表该维度的下标值。当索引中的元素数量达到目标ndarray的大小时,就变得相当容易了。

以下示例从对象 ndarray 中的每一行的指定列获取一个元素。因此,行索引包含所有行号,列索引指定要选择的元素。

示例1

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]

结果包括(0,0)(1,1)(1,1) ( 1,1) (2, 0) 在数组中)元素就位。

下面的示例获取 4X3 数组每个角的元素。行索引为 [0,0][3,3],而列索引为 [0,2]♽[0,2]♽ ❀, 2]

示例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对象。

连续索引和基本索引可以使用切片 : 或省略号 ... 与索引数组组合。下面的示例使用 slice 作为列索引和高级索引。当两者都使用切片时,结果是相同的。但高级索引会导致重复,并且可能具有不同的内存布局。

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

输出如下:

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

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

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

布尔索引

当结果对象是布尔运算(例如比较运算符)的结果时,使用这种类型的高级索引。

示例 1

在此示例中,布尔索引结果将返回超过 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]

示例2

本示例使用~(补码运算符)来过滤♽♽。

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.]

示例 3

以下示例演示如何从数组中过滤非复数元素。

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]

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门