NumPy 高级索引

NumPy 高级索引

可以从ndarray中进行选择,该ndarray是一个非元组序列、整数或布尔数据类型的ndarray对象,或者一个至少包含一个序列对象的元组。高级索引总是返回数据的副本。相比之下,切片只呈现一个视图。

有两种类型的高级索引− 整数布尔

整数索引

这种机制可以根据其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)和(2,0)位置上的元素。

在下面的例子中,选择了一个4X3数组的角上的元素。选择的行索引是[0, 0]和[3,3],而列索引是[0,2]和[0,2]。

示例2

import numpy as np 
x = np.array([[ 0,  1,  2],[ 3,  4,  5],[ 6,  7,  8],[ 9, 10, 11]]) 

print 'Our array is:' 
print x 
print '\n' 

rows = np.array([[0,0],[3,3]])
cols = np.array([[0,2],[0,2]]) 
y = x[rows,cols] 

print 'The corner elements of this array are:' 
print y

此程序的输出结果如下:

Our array is:                                                                 
[[ 0  1  2]                                                                   
 [ 3  4  5]                                                                   
 [ 6  7  8]                                                                   
 [ 9 10 11]]

The corner elements of this array are:                                        
[[ 0  2]                                                                      
 [ 9 11]]

结果选择是一个包含角元素的ndarray对象。

通过使用一个切片(:)或省略号(…)与索引数组,可以结合使用高级和基本索引。下面的示例使用切片作为行索引,使用高级索引作为列索引。当两者都使用切片时,结果相同。但是,高级索引会产生副本,并可能具有不同的内存布局。

示例3

import numpy as np 
x = np.array([[ 0,  1,  2],[ 3,  4,  5],[ 6,  7,  8],[ 9, 10, 11]]) 

print 'Our array is:' 
print x 
print '\n'  

# slicing 
z = x[1:4,1:3] 

print 'After slicing, our array becomes:' 
print z 
print '\n'  

# using advanced index for column 
y = x[1:4,[1,2]] 

print 'Slicing using advanced index for column:' 
print y

程序的输出如下:

Our array is:
[[ 0  1  2] 
 [ 3  4  5] 
 [ 6  7  8]
 [ 9 10 11]]

After slicing, our array becomes:
[[ 4  5]
 [ 7  8]
 [10 11]]

Slicing using advanced index for column:
[[ 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 'Our array is:' 
print x 
print '\n'  

# Now we will print the items greater than 5 
print 'The items greater than 5 are:' 
print x[x > 5]

这个程序的输出将会是 −

Our array is: 
[[ 0  1  2] 
 [ 3  4  5] 
 [ 6  7  8] 
 [ 9 10 11]] 

The items greater than 5 are:
[ 6  7  8  9 10 11]

示例2

在这个例子中,使用~(补码运算符)忽略了NaN(不是数字)元素。

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]

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程