Numpy高級索引

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]]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章