numpy是python高性能科學計算和數(shù)據(jù)分析的基礎(chǔ)包,python的很多其他庫都構(gòu)建在numpy之上,因此你要用python做數(shù)據(jù)分析與挖掘都最好先學一下numpy的基本操作(當然要學numpy首先要把python語言本身的基本操作要學一下),這也是我看吳恩達神經(jīng)網(wǎng)絡(luò)基礎(chǔ)課程的感受,否則聽的時候可能聽懂了,但是寫代碼的時候,發(fā)現(xiàn)下不了手,甚至就算看著別人的代碼來寫,也總感覺很模糊。
python語言提供了list容器,而ndarray是numpy提供的多維數(shù)組對象,擁有一系列好用的屬性和方法,因為我裝的是anaconda,numpy等常用科學計算包都是是默認安裝的,所以可以直接引入numpy包
import numpy as np
創(chuàng)建ndarray
通過numpy提供的array函數(shù)np.array(data,dtype=np.int32)可以創(chuàng)建ndarray,同時可以指定元素數(shù)據(jù)類型,如不指定,numpy會自己推斷較合適的數(shù)據(jù)類型,對于大數(shù)據(jù)集,一定要關(guān)注自己的數(shù)據(jù)類型,如圖像的像素值都是0-255之間的數(shù),因此用無符號的8位就夠了,但如果用4個字節(jié)的int,每個像素點就會浪費3個字節(jié),一張64*64的圖片就會浪費12288個字節(jié),即12kb,這對于大數(shù)據(jù)集是非??膳碌?。具體有哪些數(shù)據(jù)類型這里不作介紹,需要的時候去查就好了。
# 一維
data = [1, 2, 3, 4, 5];
arr = np.array(data)
# 二維
data = [
[1, 2, 3, 4],
[4, 5, 6, 7]
]
arr = np.array(data)
# 三維 以64*64*3圖片為例,64*64表示長寬,3表示每個像素的rgb值
data = [
// 一列或一行
[
[120, 255, 0], //每一列或每一行的每個像素點
[110, 123, 1],
... # 共64個
],
[
[130, 205, 0],
[160, 123, 1]
],
... # 共64個
]
# n維同理
除此之外,numpy也提供了一些方法來創(chuàng)建一些經(jīng)常用到的數(shù)組。
# 創(chuàng)建10個元素全為0的數(shù)組
np.zeros(10)
# 創(chuàng)建3*6的全為0的數(shù)組
np.zeros((3,6))
# 創(chuàng)建10個元素全為1的數(shù)組
np.ones(10)
# 創(chuàng)建2*3的隨機數(shù)組
arr = np.random.random((2,3))
# 創(chuàng)建從0-14的整數(shù)數(shù)組
np.arange(15)
# 創(chuàng)建一個10*10單位矩陣,即左上到右下的對角線元素為1,其余全為0
np.eye(10)
ndarray常用屬性
以上文中提到到圖片三維ndarray為例
# ndaray的維度
print(arr.ndim) # 因為是三維 所以是3
# ndarray的形狀
print(arr.shape) # (64,64,3)
print(arr.shappe[0]) # 64
# ndarray所有元素的個數(shù)
print(arr.size) # 64*64*3 = 12288
# ndarray的數(shù)據(jù)類型
print(arr.dtype) # int32
ndarray索引和切片
數(shù)組索引即如何找到數(shù)組中的元素,ndarray數(shù)組索引除了支持標量,同時還支持切片,以及花式索引(這里不作介紹)。再說切片之前,先說"軸",一個ndarray至少有一個軸,一維只有一個x軸,二維的話有x軸和y軸,三維再加一個z軸,多維同理。有n個維度,則最多支持n個索引。如三維數(shù)組,可以通過arr[a]、arr[a][b]或者arr[a,b]、arr[a][b][c]或者[a,b,c]取到某個特定的元素。
a,b,c除了可以為具體的數(shù)字,也可以為一個切片。和python中的list一樣,通過冒號:表示切片,只有:表示整個軸。:前后都可以寫數(shù)字,如1:5,表示這個軸上從1到5的元素,1:則表示這個軸上從1到最后一個元素:6則表示這個軸上從0到第6個元素,元素可能是一個標量也可能是一個子數(shù)組,示例如下:
arr = np.arange(10)
print(arr) # [0,1,2,3,4,5,6,7,8,9]
print(arr[3]) # 3
print(arr[:]) # 一維只有一個x軸,因此輸出 [0,1,2,3,4,5,6,7,8,9]
print(arr[3:5]) # x軸上3-5的元素 輸出 [3,4]
# 二維數(shù)組
arr = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
print(arr[0]) # [1,2,3,4]
print(arr[:])
print(arr[:,:])
# 上面這倆條都會返回整個array
print(arr[1,2:]) # 第一維度上的第一個元素,從第0個開始到最后一個元素 即 [7,8]
print(arr[:2]) # 第一個維度從0到第2個元素 即 [ [1,2,3,4], [5,6,7,8] ]
print(arr[:2,:1]) # [[1],[5]]
需要注意的是,ndarray中的切片都是原數(shù)組的視圖,因此對切片的任何操作都會體現(xiàn)到原數(shù)組中,如果需要拷貝數(shù)組,需要顯示的調(diào)用copy函數(shù)。示例如下
arr = np.arange(10)
print(arr) # [0,1,2,3,4,5,6,7,8,9]
print(arr[3:5]) # [3,4]
arr[3:5] = 12 # 修改切片同時會修改原數(shù)組
print(arr[3:5]) # [12,12]
print(arr) # [0,1,2,12,12,5,6,7,8,9]
copy = arr.copy()
copy[3:5] = 8
print(copy) # [0,1,2,8,8,5,6,7,8,9]
print(arr) # [0,1,2,12,12,5,6,7,8,9]
ndarray運算
大小相等的數(shù)組的數(shù)組之間的任何運算都會應(yīng)用到元素級別。例如:
arr1 = np.array([[1,2,3],[4,5,6]])
arr2 = np.array([[1,2,3],[4,5,6]])
print(arr1*2) # [[2,4,6],[8,10,12]]
print(arr1+arr2) # [[2,4,6],[8,10,12]]
print(arr1*arr2) # [[1,4,9],[16,25,36]]
ndarray常用函數(shù)
有些是在numpy命名空間下的,有些則是要通過具體的數(shù)組對象來調(diào)用,,有的則都可以。下文中,np.func()表示在numpy命名空間下,arr.func()則表示通過具體數(shù)組對象調(diào)用。
數(shù)組重塑 arr.reshape(newshape) 參數(shù)為一個表示新數(shù)組形狀的元組。作為參數(shù)形狀的其中一維可以是-1,表示該維度大小由數(shù)據(jù)本身推斷而來。示例如下:
arr = np.arange(15).reshape(3,5)
print(arr)
# [
# [0,1,2,3,4],
# [5,6,7,8,9],
# [10,11,12,13,14]
# ]
arr = np.arange(15).reshape(3,-1)
# 輸出和上面的一樣
數(shù)組轉(zhuǎn)置arr.transpose() 無參數(shù),也可以直接用T屬性表示,如arr.T表示arr的轉(zhuǎn)置。如果你還記得線性代數(shù),那么轉(zhuǎn)置矩陣聽起來一定很耳熟二維數(shù)組轉(zhuǎn)置比較好理解,即行變成列,列變成行。三維及其以上稍微復雜點,這里不介紹。
矩陣點乘 np.dot(x,y) 或者 arr.dot(arr.T) 這也是專門針對線性代數(shù)提供的函數(shù),關(guān)于點乘,等同于線性代數(shù)里的矩陣乘法,因此要滿足前一個矩陣A的列數(shù)等于后一個矩陣B的行數(shù),矩陣乘法才有意義。
除了dot函數(shù),還有其他針對線性代數(shù)的函數(shù),但這個在后面的代碼中會經(jīng)常用到。
arr.sort()排序函數(shù)
常用的數(shù)學計算以及分析統(tǒng)計函數(shù)
這個有很多,最常見的如求和,求平均值,求方差,標準差,指數(shù),對數(shù)等。需要做統(tǒng)計和計算的時候,先查下API文檔,看有沒有官方提供的函數(shù)。能用numpy函數(shù)的就用函數(shù),盡量不要自己寫循環(huán)處理數(shù)組,numpy數(shù)組的性能是非常好的。
以上并不是numpy數(shù)組的全部知識,只是我看了吳恩達神經(jīng)網(wǎng)絡(luò)基礎(chǔ)課程認為當下上手編寫代碼需要具備的知識。
主要參考資料:利用python進行數(shù)據(jù)分析