如果一個(gè)ndarray
是非元組序列,數(shù)據(jù)類型為整數(shù)或布爾值的ndarray
,或者至少一個(gè)元素為序列對(duì)象的元組,我們就能夠用它來索引ndarray
。高級(jí)索引始終返回?cái)?shù)據(jù)的副本。 與此相反,切片只提供了一個(gè)視圖。
有兩種類型的高級(jí)索引:整數(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),列索引指定要選擇的元素。
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]
。
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)存布局。
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í)索引。
這個(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]
這個(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.]
以下示例顯示如何從數(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]