前言
Numpy最重要的一個特點就是其N維數組對象(即ndarray),該對象是一個快速而靈活的大數據集容器。可以利用這種數組對整塊數據執行一些數學運算。模塊導入方式如下:
import numpy as np
ndarray是一個通用的同構數據多維容器,也就是說,其中的所有元素必須是相同類型的。每個數組都有一個shape(一個表示各維度大小的元組)和一個dtype(一個用於說明數組數據類型的對象)。
#查看元組各維度大小
In[9]:data.shape
Out[9]: (2, 3)
#查看數組數據類型的對象
In[10]:data.dtype
Out[10]: dtype('float64')
創建ndarray
創建數組最簡單的辦法就是使用array函數。它接受一切序列型的對象(包括其他數組),然後產生一個新的含有傳入數據的Numpy數組。
np.array會嘗試為新建的這個數組推斷出一個較為合適的數據類型。數據類型保存在一個特殊的dtype對象中。
ndarray的數據類型
dtype(數據類型)是一個特殊的對象,它含有ndarray將一塊內存解釋為特定數據類型所需的信息:
arr1=np.array([1,2,3],dtype=np.float64)
arr1.dtype
Out[12]: dtype('float64')
使用astype函數轉換dtype
使用「對象.astype()」。
float_arr=arr.astype(np.float64)
#如果將浮點數轉換成整數,則小數部分將會被截斷。
注意小數點不是四捨五入,而是直接幹掉。
#如果某字符串數組表示的全是數字,也可以用astype將其轉換為數值形式。
數組的dtype還有另外一個用法。【參見P87】
int_array.astype(calibers.dtype)
calibers是數組對象。
數組和標量之間的運算
數組很重要,因為它使你不用編寫循環即可對數據執行批量運算。這通常就叫做矢量化(vectorization)。
#大小相等的數組之間的任何算術運算都會將運算應用到元素級。比如,對象級的乘法(arr*arr)、減法(arr-arr)。
#不同大小的數組之間的運算叫做廣播(broadcasting)。(第12章進行介紹)
基本的索引和切片
Numpy數組的索引是一個內容豐富的主題,因為選取數據子集或單個元素的方式有很多。當你將一個標量值賦值給一個切片時(如arr[5:8]=12),該值會自動傳播到整個選取。跟列表最重要的區別在於,數組切片是原始數據的視圖。
遞歸訪問
可以傳入一個以逗號隔開的索引列表來選取單個元素。下面兩種方式是等價的:
In[26]: arr2d[0][2]
Out[26]: 3
#以逗號隔開,進行遞歸索引
In[27]: arr2d[0,2]
Out[27]: 3
切片索引
一維對象很簡單。
高維度對象的花樣更多,可以在一個或多個軸上進行切片,也可以跟整數索引混合使用。
可以看出,它是沿著第0軸(即第一個軸)切片的。也就是說,切片是沿著一個軸向選取元素的。可以一次傳入多個切片,就像傳入多個索引那樣。
通過將整數索引和切片混合,可以得到低維度的切片。
只有「冒號」表示選取整個軸,因此可以像下面這樣對高維軸進行切片。
布爾型索引
In[59]:data[names=='Bob']
Out[59]:
array([[ 1.33294395, -1.81762768, -0.85209052, 0.1009952 ],
[ 1.98143939, -0.17456857, 0.35297145, -0.53826328]])
布爾型數組的長度必須跟被索引的軸長度一致。此外,還可以將布爾型數組跟切片、整數(或整數序列)混合使用:
In[60]:data[names=='Bob',2:]
Out[60]:
array([[-0.85209052, 0.1009952 ],
[ 0.35297145, -0.53826328]])