Numpy入門03---ndarray多維數組對象(下)

上篇文章咱們講到了NumPy的建立、算術運算及廣播特性。這篇文章咱們將繼續學習NumPy。數組

01基礎索引與切片

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的前兩行。

02 布爾索引

咱們能夠經過一個布爾數組來索引目標數組。

布爾索引經過布爾運算(如:比較運算符)來獲取符合指定條件的元素的數組。

如下實例獲取大於 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)])

多個條件並列時,可使用&|進行鏈接。

03 神奇索引

神奇索引(花式索引)是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]])

結果:

04 數組轉置和換軸

轉置是一種特殊的數據重組形式,能夠返回底層數據的視圖而不須要複製任何內容。

數組擁有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)
  • arr:輸入的數組
  • axis1:對應第一個軸的整數
  • axis2:對應第二個軸的整數

舉例:

a = np.arange(8).reshape(2,2,2)

print ('原數組:')
print (a)
print ('\n')

print ('調用 swapaxes 函數後的數組:')
print (np.swapaxes(a, 2, 0))

結果:

相關文章
相關標籤/搜索