Numpy比Python提供更多的索引方式,有助於我們提取數據,這裏說一下整數數組索引,布爾索引和花式索引。
整數數組索引:
例1:
import numpy as np
x = np.array([[1, 2], [3, 4], [5, 6]])
y = x[[0,1,2], [0,1,0]]
print (y)
讀一下代碼,然後我們看輸出結果:取得的是(0,0),(1,1)和(2,0)的位置的元素。
x[[0,1,2],[0.1.0]]獲取方式是:第一個列表[0,1,2]表示行索引,第二個列表[0,1,0]表示列索引。
所以選取的第一個元素是(0,0)位置處的元素,第二元素是(1,1)位置處的元素,第三個元素是(2,0)位置處的元素。
運行結果:
[1 4 5]
例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)
這裏是一個4*3的二維數組,行索引是[0,0]和[3,3],列索引是[0,2]和[0,2]
這裏將行索引和列索引分開是爲了使輸出的結果也是多維的,因爲要輸出四個角的元素,所以這裏生成二維數組。
如果寫成 rows = np.array([0,0,3,3]) cols = np.array([0,2,0,2])獲得的數組是一維的。
運行結果:
我們的數組是:
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
這個數組的四個角元素是:
[[ 0 2]
[ 9 11]]
例3:
import numpy as np
a = np.array([[1,2,3], [4,5,6],[7,8,9]])
b = a[1:3, 1:3]
c = a[1:3,[1,2]]
d = a[:,1:]
print(b)
print(c)
print(d)
這裏是將切片與索引結合,這裏注意:切片包含開始不包含結尾!!!!
運行結果:
[[5 6]
[8 9]]
[[4 6]
[7 9]]
[[2 3]
[5 6]
[8 9]]
布爾索引:
例1:
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 的元素
b = x>5
print("布爾數組爲:\n",b)
print('大於 5 的元素是:')
print(x[b])
運行結果:
我們的數組是:
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
布爾數組爲:
[[False False False]
[False False False]
[ True True True]
[ True True True]]
大於 5 的元素是:
[ 6 7 8 9 10 11]
這裏我們通過布爾運算(如比較運算符)生成一個布爾數組,然後選取符合條件的元素。
布爾數組和原素組元素一一對應,true就會顯示,false不會顯示。
例2:
import numpy as np
a = np.array([np.nan, 1,2,np.nan,3,4,5])
print (a)
print (a[~np.isnan(a)])
輸出結果:
[nan 1. 2. nan 3. 4. 5.]
[1. 2. 3. 4. 5.]
這裏我們可以看出在數組中有NaN,這裏我們用到了~(取補運算符)過濾NaN。先判斷是否是NaN,返回布爾類型,再取補。
例3:
import numpy as np
a = np.array([1, 2+6j, 5, 3.5+5j])
print(a[np.iscomplex(a)])
print(a[~np.iscomplex(a)])
運行結果:
[2. +6.j 3.5+5.j]
[1.+0.j 5.+0.j]
這裏我們將數組中的非負數過濾掉,同樣如果要過濾複數需要使用取補運算符,但是這裏也會吧實數變成帶虛部的形式。
花式索引
花式索引指的是利用整數數組進行索引。
花式索引根據索引數組的值作爲目標數組的某個軸的下標來取值。對於使用一維整型數組作爲索引,如果目標是一維數組,那麼索引的結果就是對應位置的元素;如果目標是二維數組,那麼就是對應下標的行。
花式索引跟切片不一樣,它總是將數據複製到新數組中。
例1:
import numpy as np
x=np.arange(32).reshape((8,4))
print (x)
print (x[[4,2,1,7]])
同樣這裏是先行索引,再列索引,這裏只有一個列表,所以表示的是行索引。選取數組的角標爲4,2,1,7的整行元素。
運行結果:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]
[16 17 18 19]
[20 21 22 23]
[24 25 26 27]
[28 29 30 31]]
[[16 17 18 19]
[ 8 9 10 11]
[ 4 5 6 7]
[28 29 30 31]]
同時這裏也可以使用倒序索引數組。注意的是倒序索引時倒數“-1”表示倒數第一行而不是“0”!
import numpy as np
x=np.arange(32).reshape((8,4))
print (x)
print (x[[-4,-2,-1,-7]])
運行結果:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]
[16 17 18 19]
[20 21 22 23]
[24 25 26 27]
[28 29 30 31]]
[[16 17 18 19]
[24 25 26 27]
[28 29 30 31]
[ 4 5 6 7]]
例2:
當我們需要取得具體一個或者幾個元素時我們可以使用np.ix_
import numpy as np
x=np.arange(32).reshape((8,4))
print (x)
print (x[np.ix_([1,5,7,2],[0,3,1,2])])
這裏行索引的每一個元素和列索引的每一個元素都要匹配一次,如行索引第一個元素“1”分別對應列索引的每一個元素,索引取得的數組爲[[1,0],[1,3],[1,1],[1,2]]這樣的順序。
同時如果要取某一個特定的元素也可以這樣獲取。
運行結果:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]
[16 17 18 19]
[20 21 22 23]
[24 25 26 27]
[28 29 30 31]]
[[ 4 7 5 6]
[20 23 21 22]
[28 31 29 30]
[ 8 11 9 10]]