NumPy高级索引


可以从ndarray中选择一个非元组序列,整数或布尔数据类型的ndarray对象,或者至少包含一个项目作为序列对象的元组。高级索引始终返回数据的副本。与此相反,切片只呈现一个视图。

有两种高级索引 - 整型布尔型

整数索引

该机制有助于根据其无限维索引在数组中选择任意的项目。每个整数数组代表该维度中的索引数量。当索引由与目标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对象。

高级和基本索引可以通过使用一个slice(:)或省略号(...)与索引数组结合使用。以下示例对列使用slice和高级索引。当切片用于两者时结果相同。但高级索引会导致复制,并可能有不同的内存布局。

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