python數(shù)據(jù)分析基礎(chǔ):numpy

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ù)分析

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 暴力離婚,兩個詐騙訴訟(馮超詐騙),兩個法律顧問,一個刑事拘留(銷售假藥罪),還有一個是勞動糾紛,3份律師函(開...
    昨日蒙冉閱讀 248評論 0 0
  • 引言 首先我是一個菜雞,對redux的掌握還只是停留在能使用層面,這里只是記錄一下我的這個react博客的redu...
    ape_caesar閱讀 651評論 2 0
  • 我是個追劇從來沒堅持過的人,起碼這幾年都是這樣,看沒幾集就放棄了,可是這個劇我已經(jīng)堅持到了現(xiàn)在。 后來想了想,可能...
    燊寒閱讀 461評論 2 1

友情鏈接更多精彩內(nèi)容