上篇文章咱們講到了NumPy的建立、算術運算及廣播特性。這篇文章咱們將繼續學習NumPy。數組
ndarray對象的內容能夠經過索引或切片來訪問和修改,與 Python 中 list 的切片操做同樣。函數
import numpy as np arr = np.arange(10) print(arr) print(arr[5]) print(arr[2:5]) print(arr[5:]) print(arr[:3])
結果以下:學習
區別於Python的內建列表,數組的切片是原數組的視圖。這意味着數據並非被複制了,任何對於視圖的修改都會反映到原數組上。3d
若是想要數組切片的拷貝而不是視圖,就須要顯式調用arr[x:y].copy()
。code
ndarray 數組能夠基於 0 - n 的下標進行索引,切片對象能夠經過內置的 slice 函數,並設置 start, stop 及 step 參數進行,從原數組中切割出一個新數組。對象
a = np.arange(10) s = slice(2,7,2) # 從索引 2 開始到索引 7 中止,間隔爲2 print (a[s])
在二維數組中,每一個索引值對應的元素再也不是一個值,而是一個一維數組:blog
arr2d = np.array([[1,2,3],[4,5,6],[7,8,9]]) print(arr2d) print(arr2d[2]) # 下面兩種方式效果同樣 print(arr2d[0][2]) print(arr2d[0, 2])
輸出以下:索引
在展現二維數組的索引上,咱們能夠將「0」軸看作行,「1」軸看作列。import
思考一下: 下面二維數組的切片意味着什麼?基礎
print(arr2d[:2]) print(arr2d[:2,1:])
數組沿着軸0進行了切片。表達式arr2d[:2]
的含義爲選擇arr2d的前兩行。
咱們能夠經過一個布爾數組來索引目標數組。
布爾索引經過布爾運算(如:比較運算符)來獲取符合指定條件的元素的數組。
如下實例獲取大於 5 的元素:
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 > 5) print(x[ x > 5 ])
結果以下:
可使用!=
或~
對條件取反。如:
print(x[~(x > 5)])
多個條件並列時,可使用&
或|
進行鏈接。
神奇索引(花式索引)是NumPy中的術語,用於描述使用整數數組進行數據索引。
花式索引根據索引數組的值做爲目標數組的某個軸的下標來取值。
對於使用一維整型數組做爲索引,若是目標是一維數組,那麼索引的結果就是對應位置的元素;
若是目標是二維數組,那麼就是對應下標的行。
花式索引跟切片不同,它老是將數據複製到新數組中。
arr1 = np.arange(32).reshape((8,4)) print(arr1) print("------------1--------------") print(arr1[[4,2,5,1]]) print("------------2--------------") print(arr1[[-2,-1,-5,-3]]) print("------------3--------------") print(arr1[[1,5,7,2],[0,3,1,2]])
結果:
轉置是一種特殊的數據重組形式,能夠返回底層數據的視圖而不須要複製任何內容。
數組擁有transpose方法,也有特殊的T屬性。
arr2 = np.arange(15).reshape((3,5)) print("----轉置前------") print(arr2) print("----轉置後------") print(arr2.T)
arr3 = np.arange(16).reshape((2,2,4)) print("--------轉換前-------") print(arr3) print("--------轉換後-------") print(arr3.transpose(2,1,0))
轉換規則:
0 [0,0,0] [0,0,0] 1 [0,0,1] [1,0,0] 2 [0,0,2] [2,0,0] 3 [0,0,3] [3,0,0] 4 [0,1,0] [0,1,0] 5 [0,1,1] [1,1,0] 6 [0,1,2] [2,1,0] 7 [0,1,3] [3,1,0] 8 [1,0,0] [0,0,1] 9 [1,0,1] [1,0,1] 10 [1,0,2] [2,0,1] 11 [1,0,3] [3,0,1] 12 [1,1,0] [0,1,1] 13 [1,1,1] [1,1,1] 14 [1,1,2] [2,1,1] 15 [1,1,3] [3,1,1]
其中第一列是值,第二列是轉置前位置,第三列是轉置後,看到轉置後位置。
再例如:
print(arr2.transpose(1,0,2))
結果以下:
將軸轉換:
0 [0,0,0] [0,0,0] 1 [0,0,1] [0,0,1] 2 [0,0,2] [0,0,2] 3 [0,0,3] [0,0,3] 4 [0,1,0] [1,0,0] 5 [0,1,1] [1,0,1] 6 [0,1,2] [1,0,2] 7 [0,1,3] [1,0,3] 8 [1,0,0] [0,1,0] 9 [1,0,1] [0,1,1] 10 [1,0,2] [0,1,2] 11 [1,0,3] [0,1,3] 12 [1,1,0] [1,1,0] 13 [1,1,1] [1,1,1] 14 [1,1,2] [1,1,2] 15 [1,1,3] [1,1,3]
swapaxes函數用於交換數組的兩個軸,格式以下:
numpy.swapaxes(arr, axis1, axis2)
舉例:
a = np.arange(8).reshape(2,2,2) print ('原數組:') print (a) print ('\n') print ('調用 swapaxes 函數後的數組:') print (np.swapaxes(a, 2, 0))
結果: