第一站:Numpy數組!

鴿了好幾天沒寫啦,這幾天的事情真的多,不過總算是把老師的任務完成了,說不定我會寫一篇文章記錄一下這個過程里碰到的坑!那麼從今天開始我們就要開始進入Numpy的篇章啦!在介紹什麼是Numpy之前,我想和大家聊一聊數據科學最重要也最基本的內容——數據。在我們的日常生活里,我們接收到來自外界的聲音,圖像,文字信息,數值表格等,這些都是數據!數據的來源和格式都十分豐富,從我剛剛舉的例子,我們可以很顯然的發現數據之間存在異構性,但是將數據簡單的看作數字數組非常有助於我們理解和處理數據!我們可以將圖像(尤其是數字圖像)簡單地看作二維數字數組,這些數字數組代表各個區域的像素值;聲音片段可以看作時間和強度的一維數組;文本也可以通過各種方式轉換成數值表示,一種可能的轉換是用二進位數表示特定單詞或單詞對出現的頻率。所以說,不管數據是何種形式,第一步都是將這些數據轉換成數值數組形式的可分析數據。

正因為如此,有效地存儲和操作數值數組是數據科學中絕對的基礎過程。而我們將會介紹Python中專門用來處理這些數值數組的工具:Numpy Pandas Numpy(Numerical Python的簡稱)提供了高效存儲和操作密集數據緩存的介面,隨著數組在維度上變大,Numpy數組提供了更加高效的存儲和數據操作。Numpy數組幾乎是整個Python數據科學生態系統的核心,所以說 Numpy 很重要,一定要好好學!!!還要記得一句我之前就說過的話:代碼時寫出來的!!!不是看來的!!!光靠眼睛看是一定學不會的!!!一定要多寫代碼,訓練,訓練,再訓練!!!

遵循傳統,你會發現 Scipy/PyData 社區大多數人都用 np 作為別名導入Numpy,也就是import numpy as np,在之後的內容,我們都會用這種方式來導入和使用Numpy!那我們就先來創建一些Numpy數組,看看有多麼簡單便利吧!

>>> import numpy as np# 我們可以用np.array從Python列表創建數組# 整形數組>>> np.array([1, 4, 2, 5, 3])array([1, 4, 2, 5, 3])

不同於Python列表,Numpy要求數組必須包含同一類型的數據。如果類型不匹配,Numpy會向上轉換(如果可行的話)。在這裡,整形被轉換成了浮點型

>>> np.array([3.14, 4, 2, 3])array([3.14, 4. , 2. , 3. ])

如果希望明確設置數組的數據類型,可以用 dtype 關鍵字:

>>> np.array([1, 2, 3, 4], dtype=float32)array([1., 2., 3., 4.], dtype=float32)

不同於Python列表,Numpy數組可以被指定為多維的,以下是用嵌套列表(list of list)初始化多維數組的一種方法:

>>> np.array([range(i, i+3) for i in [2, 4, 6]])array([[2, 3, 4], [4, 5, 6], [6, 7, 8]])

面對大型數組的時候,用Numpy內置的方法創建數組會十分高效!!!我們接下來來看一些示例:

# 創建一個長度為10的全0數組>>> np.zeros(10, dtype=int)array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])# 創建一個3*5的浮點數數組,數組的數值都是1>>> np.ones((3, 5), dtype=float)array([[1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.]])# 創建一個3*5的浮點數數組,數組的數值都是3.14>>> np.full((3, 5), 3.14)array([[3.14, 3.14, 3.14, 3.14, 3.14], [3.14, 3.14, 3.14, 3.14, 3.14], [3.14, 3.14, 3.14, 3.14, 3.14]])# 創建一個3*5的浮點數數組,數組的值是一個等差數列# 從0開始,到20結束,步長為2#(與Python內置的range()函數類似,一個左閉右開區間,左端點包括,右端點不包括)>>> np.arange(0, 20, 2)array([0, 2, 4, 6, 8, 10, 12, 14, 16, 18])# 創建一個5個元素的數組,這5個數均勻的分配到0-1之間>>> np.linspace(0, 1, 5)array([0. , 0.25, 0.5 , 0.75, 1. ])# 創建一個3*3的、在0~1均勻分布的隨機數組成的數組>>> np.random.random((3, 3))array([[0.4190726 , 0.4074294 , 0.57992706], [0.32524021, 0.64923027, 0.70900213], [0.14805319, 0.2452382 , 0.65779485]])# 創建一個3*3的、均值為0、方差為1的# 正態分布的隨機數組>>> np.random.normal(0, 1, (3, 3))array([[ 1.88357052, -0.94604242, 1.86352547], [-1.03527481, -0.57414738, 0.57942784], [-0.01226101, 0.55630524, 0.90687584]])# 創建一個3*3的、[0, 10)區間的隨機整型數組>>> np.random.randint(0, 10, (3, 3))array([[4, 0, 4], [0, 3, 6], [9, 5, 3]])# 創建一個3*3的單位矩陣>>> np.eye(3)array([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]])# 創建一個由3個整形數組成的未初始化的數組# 數組的值是內存空間中的任意值>>> np.empty(3)array([1., 1., 1.])

之前我們看到了,當創建一個數組的時候,可以使用dtype來指定生成的數據類型,例如:

>>> np.zeros(10, dtype=int16)array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype=int16)>>> np.zeros(10, dtype=np.int16)array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype=int16)

實際上,正是因為有著眾多的數據類型,才讓Numpy能夠靈活的處理外界數據,我們來看一看Numpy的標準數據類型,知乎的這個編輯器我是真的不知道怎麼打表格……所以我放在Github里了,你們去看一看就知道!

雖然說Numpy有這麼多中數據類型可選,但是一般情況下我們用默認的類型就好,在某些特殊情況,其他的一些精度更高的類型才會派上用場,所以請初學者不用擔心!

那麼今天我們就說到這裡啦!下一篇文章我們會講一講Numpy數組的基礎操作!今天文章裡面涉及的代碼都可以在我的Github里找到,希望大家都能把今天文章里涉及的代碼在自己的電腦上寫一寫,這樣才會更有收穫!對於文章和代碼中的問題,懇請大家不吝賜教,批評指正。歡迎評論點贊,也歡迎你們私信我,有什麼不會的我們一起交流,共同進步!

推薦閱讀:

唯一值、值計數以及成員資格
Python · 樸素貝葉斯(零)· 簡介
左手用R右手Python系列11——相關性分析
python中的賦值,什麼時候是傳值什麼時候是傳址?

TAG:Python | numpy | 數據科學 |