機(jī)器學(xué)習(xí)常用Numpy語法

?NumPy(Numerical Python) 是 Python 語言的一個(gè)擴(kuò)展程序庫(kù),支持大量的維度數(shù)組與矩陣運(yùn)算,此外也針對(duì)數(shù)組運(yùn)算提供大量的數(shù)學(xué)函數(shù)庫(kù)。NumPy 的前身 Numeric 最早是由 Jim Hugunin 與其它協(xié)作者共同開發(fā),2005 年,Travis Oliphant 在 Numeric 中結(jié)合了另一個(gè)同性質(zhì)的程序庫(kù) Numarray 的特色,并加入了其它擴(kuò)展而開發(fā)了 NumPy。NumPy 為開放源代碼并且由許多協(xié)作者共同維護(hù)開發(fā)。

NumPy 是一個(gè)運(yùn)行速度非??斓臄?shù)學(xué)庫(kù),主要用于數(shù)組計(jì)算,包含:

一個(gè)強(qiáng)大的N維數(shù)組對(duì)象 ndarray

廣播功能函數(shù)

整合 C/C++/Fortran 代碼的工具

線性代數(shù)、傅里葉變換、隨機(jī)數(shù)生成等功能

在機(jī)器學(xué)習(xí)中常用的語法如下:

1、ndarray的創(chuàng)建?

數(shù)組轉(zhuǎn)換:將Python下的list轉(zhuǎn)換為ndarray

import numpy as npdata=?[6,7.5,8,0,1]array=?np.array(data)輸出:array([ 6. ,? 7.5,? 8. ,? 0. ,? 1. ])


二維數(shù)組?

data?=?[[1,2,3,4],[5,6,7,8]]array?=?np.array(data)array輸出為:array([[1, 2, 3, 4],? ? ? [5, 6, 7, 8]])

等差數(shù)組?

np.arange(1,15,2)輸出為:array([1,3,5,7,9,11,13])

隨機(jī)整數(shù)數(shù)組?

data = np.random.randint(0,10,size=(3,4))data輸出為:array([[2,2,4,5],[7, 5, 8, 5],[9, 0, 6, 1]])

2、ndarray的數(shù)據(jù)類型?

指定array的數(shù)據(jù)類型data1?=?np.array([1,2,3],dtype=np.int32)data2?=?np.array([1,2,3],dtype=np.float32)#查看array的數(shù)據(jù)類型arr2.dtype### dtype('float32')


3、數(shù)組運(yùn)算

data?=?np.array([[1,2,3],[4,5,6]],dtype=np.float32)data?*?data輸出:array([[??1.,???4.,???9.],???????[?16.,??25.,??36.]],?dtype=float32)

4、索引和切片

numpy基本的索引和切片功能和Python列表的操作相似,不過要注意的是numpy中數(shù)組切片是原始數(shù)組的視圖,這意味著數(shù)據(jù)不會(huì)被復(fù)制,視圖上任何數(shù)據(jù)的修改都會(huì)反映到原數(shù)組上,因?yàn)閚umpy被設(shè)計(jì)用來處理大數(shù)據(jù),如果切片不是視圖而是復(fù)制產(chǎn)生新數(shù)據(jù)的話,會(huì)產(chǎn)生相應(yīng)的性能和內(nèi)存問題。如下面的例子,對(duì)切片的操作會(huì)影響原數(shù)組:?

arr = np.arange(10)arr[5]# 5arr[5:8]#array([5, 6, 7])arr[5:8]=12t = arr[5:8]t[1] = 12345arr#array([? ? 0,? ? 1,? ? 2,? ? 3,? ? 4,? ? 12, 12345,? ? 12,? ? 8,? ? 9])

6、數(shù)組轉(zhuǎn)置和軸對(duì)換

數(shù)組的轉(zhuǎn)置是重塑的一種特殊形式,它返回的事原數(shù)據(jù)的視圖。不僅有transpose方法,還有特殊的T屬性:

arr = np.arange(15).reshape((5,3))

arr.T

#array([[ 0,? 3,? 6,? 9, 12],

[ 1,? 4,? 7, 10, 13],

[ 2,? 5,? 8, 11, 14]])

對(duì)于高維數(shù)組,tranpose需要得到一個(gè)由軸編號(hào)組成的元組才能對(duì)這些軸進(jìn)行轉(zhuǎn)置,太費(fèi)腦子:

arr = np.arange(16).reshape((2,2,4))

arr

#array([[[ 0,? 1,? 2,? 3],

[ 4,? 5,? 6,? 7]],

[[ 8,? 9, 10, 11],

[12, 13, 14, 15]]])

arr.transpose((1,0,2))

#array([[[ 0,? 1,? 2,? 3],

[ 8,? 9, 10, 11]],

[[ 4,? 5,? 6,? 7],

[12, 13, 14, 15]]])

還可以使用swapaxes函數(shù)進(jìn)行轉(zhuǎn)置,它接受一對(duì)軸編號(hào):

arr.swapaxes(1,2)

7、數(shù)組函數(shù)

通用函數(shù):元素級(jí)數(shù)組函數(shù)

通用函數(shù)中,有一元的函數(shù),如abs,sqrt,square,exp,log等等,也有二元的函數(shù)maximum、minimum等等,這些都比較簡(jiǎn)單,我們舉兩個(gè)例子即可:

arr = np.arange(10)

np.sqrt(arr)

x = np.random.randn(8)

y = np.random.randn(8)

np.maximum(x,y)

#array([ 0.68417031,? 0.22971426,? 1.69724546,? 1.19366822, -0.79176777, -0.43557768,? 0.66628223,? 0.85093113])

where函數(shù)

where函數(shù),三個(gè)參數(shù),條件,條件為真時(shí)選擇值的數(shù)組,條件為假時(shí)選擇值的數(shù)組:

xarr = np.array([1.1,1.2,1.3,1.4,1.5])

yarr = np.array([2.1,2.2,2.3,2.4,2.5])

cond = np.array([True,False,True,True,False])

np.where(cond,xarr,yarr)

輸出為:

array([ 1.1,? 2.2,? 1.3,? 1.4,? 2.5])

也可以使用下面的形式,后兩個(gè)參數(shù)為指定值:

np.where(xarr>1.2,2,-2)

#array([-2, -2,? 2,? 2,? 2])

數(shù)學(xué)和統(tǒng)計(jì)方法

數(shù)學(xué)和統(tǒng)計(jì)方法既可以當(dāng)作數(shù)組的實(shí)例方法調(diào)用,也可以當(dāng)作頂級(jí)numpy函數(shù)調(diào)用,比如下面兩種計(jì)算數(shù)組均值的方法是等效的:

arr = np.random.randn(5,4)

arr.mean()

np.mean(arr)

mean或sum這一類函數(shù)可以接受一個(gè)axis參數(shù),用于計(jì)算該軸向上的統(tǒng)計(jì)值,最終結(jié)果是一個(gè)少一維的數(shù)組。對(duì)于一個(gè)二維數(shù)組,axis=0相當(dāng)于按列操作,最終元素的個(gè)數(shù)和第二維的大小相同,axis=1相當(dāng)于按行操作,最終元素的個(gè)數(shù)和第一維的大小相同:

arr.mean(axis=1)

#array([ 0.29250253, -0.50119163,? 0.11746254,? 0.23338843,? 0.15912472])

arr.sum(0)

#array([ 1.92728592,? 0.67480797, -2.8398905 ,? 1.44294295])

也可以用cumsum(累加值計(jì)算)和cumprod(累積值計(jì)算)保留中間計(jì)算結(jié)果:

arr = np.array([[1,2,3],[4,5,6],[7,8,9]])

arr.cumsum(0)

#array([[ 1,? 2,? 3],

[ 5,? 7,? 9],

[12, 15, 18]])

arr.cumprod(1)

#array([[? 1,? 2,? 6],

[? 4,? 20, 120],

[? 7,? 56, 504]])

排序方法

np中還提供了排序方法,排序方法是就地排序,即直接改變?cè)瓟?shù)組:

arr = np.random.randn(8)

arr

#array([-0.85668922, -2.0049649 , -0.89885165, -0.04185277,? 0.73736138,-0.03509021, -1.89745107, -2.36576122])

arr.sort()

arr

#array([-2.36576122, -2.0049649 , -1.89745107, -0.89885165, -0.85668922,-0.04185277, -0.03509021,? 0.73736138])

集合運(yùn)算函數(shù)

unique計(jì)算x中的唯一元素,并返回有序結(jié)果

arr = np.array([1,3,2,5,2,4,2,2,1,4,5,2])

np.unique(arr)

#array([1, 2, 3, 4, 5])

numpy提供了下面三個(gè)常見的集合運(yùn)算函數(shù):

intersect1d(x,y) 用于計(jì)算x和y的公共結(jié)果,并返回有序結(jié)果

union1d(x,y) 用于計(jì)算x和y的并集,并返回有序結(jié)果

setdiff1d(x,y),集合的差,即元素在x中不在y中

x = np.array([1,2,4,5])

y = np.array([3,4,5])

np.intersect1d(x,y)

#array([4, 5])

np.union1d(x,y)

#array([1, 2, 3, 4, 5])

np.setdiff1d(x,y)

#array([1, 2])

8、線性代數(shù)

numpy還提供了許多線性代數(shù)運(yùn)算的函數(shù),比如計(jì)算矩陣的乘積:

#矩陣的乘積

x = np.array([[1,2,3],[4,5,6]])

y = np.array([[6,23],[-1,7],[8,9]])

np.dot(x,y)

下面可以計(jì)算矩陣的逆、行列式、特征值和特征向量、qr分解值,svd分解值:

#計(jì)算矩陣的逆

from numpy.linalg import inv,det,eig,qr,svd

t = np.array([[1,2,3],[2,3,4],[4,5,6]])

inv(t)

#計(jì)算矩陣行列式

det(t)

#計(jì)算QR分解址

qr(t)

#計(jì)算奇異值分解值svd

svd(t)

#計(jì)算特征值和特征向量

eig(t)

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

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

  • 夜鶯2517閱讀 128,155評(píng)論 1 9
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月,有人笑有人哭,有人歡樂有人憂愁,有人驚喜有人失落,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,834評(píng)論 28 54
  • 兔子雖然是枚小碩 但學(xué)校的碩士四人寢不夠 就被分到了博士樓里 兩人一間 在學(xué)校的最西邊 靠山 兔子的室友身體不好 ...
    待業(yè)的兔子閱讀 2,766評(píng)論 2 9
  • 信任包括信任自己和信任他人 很多時(shí)候,很多事情,失敗、遺憾、錯(cuò)過,源于不自信,不信任他人 覺得自己做不成,別人做不...
    吳氵晃閱讀 6,364評(píng)論 4 8

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