ndarray數據類型
Ndarray的基本數據類型如下圖所示,數據類型的命名采用“類型名+數字”的形式表示,數字表示數據的比特位長。在計算機中比特位bit是表示數據最小的單位,1個字節Byte的長度等於8個比特位,即1Byte = 8bit。int64表示8個字節長度的整型,float64表示為8個字節長度的雙精度浮點型。同樣類型的元素在內存中或磁盤中占的空間是一樣的,因此在處理海量數據時,如果數據類型設置不合理,會導致內存或磁盤存儲空間的浪費,並影響計算效率。但對於初學者而言,暫時不需要關注每種類型的長度,只需要知道ndarray中有整數型、浮點型、字符串型、布爾型、對象型。

Ndarray數據類型轉換
ndarray與Python列表的最大的不同就是列表可以存入不同數據類型的元素,而ndarray要求所有元素的數據類型必須一致。Numpy會自動識別ndarray中的數據類型,如果數據類型不一致Numpy會將所有元素自動轉換成一個合適的數據類型。

上圖中先后創建了3個ndarray對象,arr1由3個整數組成,arr2將arr1中的第2個元素由整數型改為浮點型,為保證同一種數據類型,Numpy會將arr2中其它元素都轉換成浮點型,arr3將arr2中的第3個元素改為字符串類型,同樣Numpy會自動將其它元素轉換成字符串型。整數型-->浮點型-->字符串型可以自動轉換,如果把順序顛倒過來不能自動轉換,因為可能會造成數據的損失,我們可以使用astype( )函數手動強制轉換。astype( )函數的原理是首先將原數組在內存中進行復制,數據類型轉換的操作是在復制的數組里進行,不會對原數組造成影響。

注意上圖中將arr4由浮點型轉換成整數型時,每個元素的小數位都被自動截掉,實際應用中可能影響數據質量;只有當所有字符串元素都表示整數型或浮點型時,才能使用astype( )函數將字符轉型轉換成整數型或浮點型,否則會報ValueError錯誤;直接把arr6轉換成整數型也會報錯。
ndarray元素訪問
ndarray可以用索引來訪問元素,一維數組的索引訪問方式與Python的list相同,多維數組只需要在索引中增加位置即可。下圖中倒數第2行arr9[2]表示一維數組arr9中的第3個元素“15”,最后一行arr10[1,1]表示二維數組arr10的第2行第2個元素“25”。

同樣ndarray可以使用切片訪問多個元素。下圖中第2行生成了0-9的整數組成的一維數組arr11,第4行進行切片操作,將數組第6-9個元素取出賦值給變量arr_slice;注意:切片是數組的視圖,任何對切片的修改都會導致原數組的元素變化,第6行將切片第1個元素的值改為“0”,原數組arr11也隨之發生了變化。如果你不想使用視圖而只是對數組切片進行復制,需要使用copy( )函數。

切片中使用m:n的形式,表示[m, n)的半開半閉的范圍。m,n分別表示切片的開始位置和結束位置,m若省略表示從第一個元素開始,n若省略表示到最后一個元素結束,m,n都省略表示取得該維度所有元素。熟練掌握切片對學習numpy很有必要,請讀者參照下圖分析切片的原理:

一維數組可以看做是個列表,二維數組可以看成是一個矩陣,可是對於多維數組,不少初學者可能會覺得不容易理解,特別是在進行切片操作時更是如此。下圖用10以內的隨機自然數填充了一個三維數組arr12,從打印的結果可以觀察到,三維數組實際上由2個二維數組組成,arr12[0]表示第1個二維數組,arr12[0, 1]表示第1個二維數組的第2行,arr12[0, 1, 2]表示第1個二維數組第2行的第3個元素。

對多維數組的切片也跟二維數組是類似的,請讀者自行分析下列幾個表達式的切片結果: