鍍金池/ 教程/ 數(shù)據(jù)分析&挖掘/ NumPy高級(jí)索引
NumPy位操作
NumPy數(shù)學(xué)算數(shù)函數(shù)
NumPy高級(jí)索引
NumPy環(huán)境安裝配置
NumPy IO文件操作
NumPy字符串函數(shù)
NumPy切片和索引
NumPy統(tǒng)計(jì)函數(shù)
NumPy矩陣庫
NumPy數(shù)組創(chuàng)建例程
NumPy線性代數(shù)
NumPy Matplotlib庫
NumPy教程
NumPy排序、搜索和計(jì)數(shù)函數(shù)
NumPy字節(jié)交換
NumPy Ndarray對(duì)象
NumPy數(shù)組操作
NumPy使用 Matplotlib 繪制直方圖
NumPy數(shù)組屬性
NumPy廣播
NumPy來自現(xiàn)有數(shù)據(jù)的數(shù)組
NumPy副本和視圖
NumPy在數(shù)組上的迭代
NumPy來自數(shù)值范圍的數(shù)組
NumPy算數(shù)運(yùn)算
NumPy數(shù)據(jù)類型

NumPy高級(jí)索引

NumPy - 高級(jí)索引

如果一個(gè)ndarray是非元組序列,數(shù)據(jù)類型為整數(shù)或布爾值的ndarray,或者至少一個(gè)元素為序列對(duì)象的元組,我們就能夠用它來索引ndarray。高級(jí)索引始終返回?cái)?shù)據(jù)的副本。 與此相反,切片只提供了一個(gè)視圖。

有兩種類型的高級(jí)索引:整數(shù)和布爾值。

整數(shù)索引

這種機(jī)制有助于基于 N 維索引來獲取數(shù)組中任意元素。 每個(gè)整數(shù)數(shù)組表示該維度的下標(biāo)值。 當(dāng)索引的元素個(gè)數(shù)就是目標(biāo)ndarray的維度時(shí),會(huì)變得相當(dāng)直接。

以下示例獲取了ndarray對(duì)象中每一行指定列的一個(gè)元素。 因此,行索引包含所有行號(hào),列索引指定要選擇的元素。

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

該結(jié)果包括數(shù)組中(0,0)(1,1)(2,0)位置處的元素。

下面的示例獲取了 4X3 數(shù)組中的每個(gè)角處的元素。 行索引是[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  '我們的數(shù)組是:'  
print x 
print  '\n' 
rows = np.array([[0,0],[3,3]]) 
cols = np.array([[0,2],[0,2]]) 
y = x[rows,cols]  
print  '這個(gè)數(shù)組的每個(gè)角處的元素是:'  
print y

輸出如下:

我們的數(shù)組是:                                                                 
[[ 0  1  2]                                                                   
 [ 3  4  5]                                                                   
 [ 6  7  8]                                                                   
 [ 9 10 11]]

這個(gè)數(shù)組的每個(gè)角處的元素是:                                      
[[ 0  2]                                                                      
 [ 9 11]]

返回的結(jié)果是包含每個(gè)角元素的ndarray對(duì)象。

高級(jí)和基本索引可以通過使用切片:或省略號(hào)...與索引數(shù)組組合。 以下示例使用slice作為列索引和高級(jí)索引。 當(dāng)切片用于兩者時(shí),結(jié)果是相同的。 但高級(jí)索引會(huì)導(dǎo)致復(fù)制,并且可能有不同的內(nèi)存布局。

示例 3

import numpy as np 
x = np.array([[  0,  1,  2],[  3,  4,  5],[  6,  7,  8],[  9,  10,  11]])  
print  '我們的數(shù)組是:'  
print x 
print  '\n'  
# 切片
z = x[1:4,1:3]  
print  '切片之后,我們的數(shù)組變?yōu)椋?#39;  
print z 
print  '\n'  
# 對(duì)列使用高級(jí)索引 
y = x[1:4,[1,2]] 
print  '對(duì)列使用高級(jí)索引來切片:'  
print y

輸出如下:

我們的數(shù)組是:
[[ 0  1  2] 
 [ 3  4  5] 
 [ 6  7  8]
 [ 9 10 11]]

切片之后,我們的數(shù)組變?yōu)椋?[[ 4  5]
 [ 7  8]
 [10 11]]

對(duì)列使用高級(jí)索引來切片:
[[ 4  5]
 [ 7  8]
 [10 11]]

布爾索引

當(dāng)結(jié)果對(duì)象是布爾運(yùn)算(例如比較運(yùn)算符)的結(jié)果時(shí),將使用此類型的高級(jí)索引。

示例 1

這個(gè)例子中,大于 5 的元素會(huì)作為布爾索引的結(jié)果返回。

import numpy as np 
x = np.array([[  0,  1,  2],[  3,  4,  5],[  6,  7,  8],[  9,  10,  11]])  
print  '我們的數(shù)組是:'  
print x 
print  '\n'  
# 現(xiàn)在我們會(huì)打印出大于 5 的元素  
print  '大于 5 的元素是:'  
print x[x >  5]

輸出如下:

我們的數(shù)組是:
[[ 0  1  2] 
 [ 3  4  5] 
 [ 6  7  8] 
 [ 9 10 11]] 

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

示例 2

這個(gè)例子使用了~(取補(bǔ)運(yùn)算符)來過濾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

以下示例顯示如何從數(shù)組中過濾掉非復(fù)數(shù)元素。

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]