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 '我們的數組是:'
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
這個例子使用了~
(取補運算符)來過濾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]