99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁(yè)大數(shù)據(jù)時(shí)代學(xué)習(xí)numpy,看這篇文章就夠啦
學(xué)習(xí)numpy,看這篇文章就夠啦
2020-09-02
收藏

【導(dǎo)語(yǔ)】在數(shù)據(jù)分析當(dāng)中,python用到最多的第三方庫(kù)就是numpy,今天我們就來(lái)講講!

作者:王皓

來(lái)源:大數(shù)據(jù)DT(ID:hzdashuju)

01 ndarray創(chuàng)建與索引

在學(xué)習(xí)Numpy之前我們需要了解一個(gè)概念:數(shù)組維數(shù)。

在計(jì)算機(jī)科學(xué)中,數(shù)組數(shù)據(jù)結(jié)構(gòu)(array data structure),簡(jiǎn)稱數(shù)組(Array),是由相同類(lèi)型的元素的集合所組成的數(shù)據(jù)結(jié)構(gòu),分配一塊連續(xù)的內(nèi)存來(lái)存儲(chǔ)。按數(shù)組維數(shù)分類(lèi)可分為:一維數(shù)組、二維數(shù)組、多維數(shù)組(N維數(shù)組)。

numpy是最著名的 python庫(kù)之一,常用于高性能計(jì)算。Numpy提供了兩種基本對(duì)象:ndarray和ufunc。

NumPy作為一個(gè)開(kāi)源的Python科學(xué)計(jì)算基礎(chǔ)庫(kù),包含:一個(gè)強(qiáng)大的N維數(shù)組對(duì)象ndarray ;廣播功能函數(shù) ;整合C/C++/Fortran代碼的工具 ;線性代數(shù)、傅里葉變換、隨機(jī)數(shù)生成等功能。NumPy是SciPy、Pandas等數(shù)據(jù)處理或科學(xué)計(jì)算庫(kù)的基礎(chǔ)。

當(dāng)然這里就有一個(gè)問(wèn)題出現(xiàn)了,Python已有列表類(lèi)型,為什么需要一個(gè)數(shù)組對(duì)象(類(lèi)型)?

因?yàn)椋?

  1. 數(shù)組對(duì)象可以去掉元素間運(yùn)算所需的循環(huán),使一維向量更像單個(gè)數(shù)據(jù)
  2. 設(shè)置專(zhuān)門(mén)的數(shù)組對(duì)象,經(jīng)過(guò)優(yōu)化,可以提升這類(lèi)應(yīng)用的運(yùn)算速度,在科學(xué)計(jì)算中,一個(gè)維度所有數(shù)據(jù)的類(lèi)型往往相同
  3. 數(shù)組對(duì)象采用相同的數(shù)據(jù)類(lèi)型,有助于節(jié)省運(yùn)算和存儲(chǔ)空間

但是Python內(nèi)置的array模塊既不支持多維數(shù)組功能,又沒(méi)有配套對(duì)應(yīng)的計(jì)算函數(shù),所以基于Numpy的ndarray在很大程度上改善了Python內(nèi)置array模塊的不足,將重點(diǎn)介紹ndarray的創(chuàng)建與索引。

1. 創(chuàng)建ndarray對(duì)象

1)ndarray數(shù)據(jù)類(lèi)型

在《Python 3智能數(shù)據(jù)分析快速入門(mén)》該節(jié)內(nèi)容中,作者羅列了15種數(shù)據(jù)類(lèi)型,其中實(shí)數(shù)數(shù)據(jù)類(lèi)型13種。這些實(shí)數(shù)數(shù)據(jù)類(lèi)型之間可以互相轉(zhuǎn)換。

這時(shí)有人會(huì)問(wèn),為什么要支持這么多種數(shù)據(jù)類(lèi)型?是因?yàn)閷?duì)比Python語(yǔ)法來(lái)說(shuō)僅支持整數(shù)、浮點(diǎn)數(shù)和復(fù)數(shù)3種類(lèi)型,但是當(dāng)科學(xué)計(jì)算涉及數(shù)據(jù)較多,對(duì)存儲(chǔ)和性能都有較高要求,所以對(duì)數(shù)據(jù)類(lèi)型進(jìn)行精細(xì)定義,有助于NumPy合理使用存儲(chǔ)空間并優(yōu)化性能和程序員對(duì)程序規(guī)模有合理評(píng)估。

對(duì)于15種數(shù)據(jù)類(lèi)型在這里筆者將不贅述,書(shū)上有詳細(xì)的解釋以及案例示范。

2)ndarray創(chuàng)建

在《Python 3智能數(shù)據(jù)分析快速入門(mén)》該節(jié)內(nèi)容中,作者介紹了兩種創(chuàng)建ndarray的方法:

  • 使用array函數(shù)創(chuàng)建數(shù)ndarray
  • 使用arange函數(shù)創(chuàng)建數(shù)ndarray

這里筆者再補(bǔ)充四種方法并整理出來(lái):

  1. 從Python中的列表、元組等類(lèi)型創(chuàng)建ndarray數(shù)組
  2. 使用NumPy中函數(shù)創(chuàng)建ndarray數(shù)組,如:arange, ones, zeros等
  3. 從字節(jié)流(raw bytes)中創(chuàng)建ndarray數(shù)組
  4. 從文件中讀取特定格式,創(chuàng)建ndarray數(shù)組

對(duì)于方法②再補(bǔ)充5個(gè)常用函數(shù):

  • np.full(shape,val):根據(jù)shape生成一個(gè)數(shù)組,每個(gè)元素值都是val
  • np.ones_like(a):根據(jù)數(shù)組a的形狀生成一個(gè)全1數(shù)組
  • np.zeros_like(a):根據(jù)數(shù)組a的形狀生成一個(gè)全0數(shù)組
  • np.full_like(a,val):根據(jù)數(shù)組a的形狀生成一個(gè)數(shù)組,每個(gè)元素值都是val
  • np.concatenate():將兩個(gè)或多個(gè)數(shù)組合并成一個(gè)新的數(shù)組

3)隨機(jī)數(shù)

Numpy提供了強(qiáng)大的生成隨機(jī)數(shù)的功能,使用隨機(jī)數(shù)也能創(chuàng)建ndarray?;菊Z(yǔ)法格式:numpy.random.×××() 。在《Python 3智能數(shù)據(jù)分析快速入門(mén)》該節(jié)內(nèi)容中,作者羅列了13個(gè)函數(shù)及其說(shuō)明,筆者再補(bǔ)充2個(gè)函數(shù):

  • choice(a[,size,replace,p]):從一維數(shù)組a中以概率p抽取元素,形成size形狀新數(shù)組 replace表示是否可以重用元素,默認(rèn)為False
  • poisson(lam,size):產(chǎn)生具有泊松分布的數(shù)組,lam隨機(jī)事件發(fā)生率,size形狀

2. ndarray的索引和切片

索引與切片是ndarray使用頻率最高的操作。相較于list,ndarray索引與切片在功能上更加豐富,在形式上更多樣。ndarray的高效率在很大程度上需歸功于其索引的易用性。

1)一維ndarray的索引

一維ndarray的索引方法很簡(jiǎn)單,與list的索引方法一致,相關(guān)案例在書(shū)上有展示,這里不再贅述。

2)多維ndarray的索引

多維的每一個(gè)維度都有一個(gè)索引,各個(gè)維度的索引之間用逗號(hào)隔開(kāi),例如:arr[ [維度1(行)] , [維度2(列)] ]。

代碼清單如下:

import numpy as np
print(np.arange(10))

輸出:[0 1 2 3 4 5 6 7 8 9]

arrnp.array([[1,2,3,4,5],[4,5,6,7,8],[7,8,9,10,11]])
print('\n',arr)

輸出:

[[ 1 2 3 4 5]

[ 4 5 6 7 8]

[ 7 8 9 10 11]]

#訪問(wèn)第0行中第3列和第4列元素
print('切片結(jié)果:',arr[0,3:5])

輸出:

切片結(jié)果:[4 5]

#訪問(wèn)第1行和第二行中第2列、第3列和第4列的元素
print('切片結(jié)果:\n',arr[1:,2:])

輸出:

切片結(jié)果:

[6 7 8]

[9 10 11]

#訪問(wèn)第2列的元素
print('切片結(jié)果:',arr[:2])

輸出:

切片結(jié)果:[3 6 9]

ndarray在索引與切片的時(shí)候除了使用整形的數(shù)據(jù)外,還可以使用布爾型,代碼清單如下:

索引第1、3行中第2列的元素。Define true 1, define false 0
mask=np.array([1, 0, 1], dtype=np.bool)
print(arr[mask, 1])

輸出:

[2 8]

3)花式索引

花式索引是一個(gè)Numpy術(shù)語(yǔ),是在基礎(chǔ)索引方式之上衍生出的功能更強(qiáng)大的索引方式。它能夠利用整數(shù)ndarray進(jìn)行索引。

在這節(jié)的學(xué)習(xí)中,發(fā)現(xiàn)一個(gè)有趣的問(wèn)題:在使用np.empty函數(shù)時(shí),本想用arr = np.empty((4,7))創(chuàng)建一個(gè)空的多維數(shù)組,但是返回的結(jié)果是這樣:

語(yǔ)法格式數(shù)值等都沒(méi)有什么錯(cuò)誤的情況下,初步懷疑是函數(shù)本身的原因,于是用help()函數(shù)查看它的詳細(xì)介紹,竟然查到了:

數(shù)據(jù)類(lèi)型是可選且默認(rèn)值是numpy.float64。(好家伙,書(shū)上可沒(méi)告訴我)所以只需在后面選擇int就行。

arr = np.empty((4,7),int)
print(arr)

輸出:

另一個(gè)問(wèn)題是關(guān)于ix函數(shù)生成區(qū)域索引器的問(wèn)題,代碼如下:

arr = np.array([np.arange(i*4, i*4+4) for i in np.arange(6)])
print('創(chuàng)建的二維ndarray arr為:\n', arr)

輸出:

#利用np.ix函數(shù)將兩個(gè)一維的整數(shù)ndarray轉(zhuǎn)化為方形區(qū)域的索引器
print('使用ix成片索引arr結(jié)果為:\n', arr[np.ix_([5, 1, 4, 2], [3, 0, 1, 2])])

輸出:

out[15]為什么會(huì)返回這樣一個(gè)結(jié)果?是因?yàn)閕x函數(shù)結(jié)果的排序是基于[5,1,4,2],[3,0,1,2]兩個(gè)數(shù)組產(chǎn)生的笛卡爾積,即(5,3),(5,0),(5,1),(5,2);(1,3),(1,0),(1,1),(1,2);(4,3),(4,0),(4,1),(4,2);(2,3),(2,0),(2,1),(2,2)。然后按照索引(5,3),(5,0),(5,1),(5,2)得到第0行元素:23 20 21 22,之后的以此類(lèi)推。

02 ndarray的基礎(chǔ)操作

ndarray的基礎(chǔ)操作包括設(shè)置ndarray形狀、展平ndarray、組合ndarray、分割ndarray、ndarray的排序與搜索,以及ndarray的字符串操作等。

  • 設(shè)置ndarray形狀

書(shū)中已經(jīng)介紹了12種基本函數(shù)和它們的代碼演示:

  • 通過(guò)reshape方法改變ndarray形狀
  • 通過(guò)resize方法改變ndarray形狀
  • 通過(guò)修改shape屬性改變ndarray維度
  • 使用ravel方法展平ndarray
  • 使用flatten方法展平ndarray
  • 使用hstack函數(shù)實(shí)現(xiàn)ndarray橫向組合
  • 使用vstack函數(shù)實(shí)現(xiàn)ndarray縱向組合
  • 使用concatenate函數(shù)組合ndarray
  • 使用dstack函數(shù)組合ndarray
  • 使用hsplit函數(shù)實(shí)現(xiàn)ndarray橫向分割
  • 使用vsplit函數(shù)實(shí)現(xiàn)ndarray縱向分割
  • 使用split函數(shù)分割ndarray
  • 使用dsplit函數(shù)實(shí)現(xiàn)ndarray深度分割

在這里做幾點(diǎn)補(bǔ)充和說(shuō)明:

  • .swapaxes(ax1,ax2):將數(shù)組n個(gè)維度中兩個(gè)維度進(jìn)行調(diào)換
  • .astype(new_type):一定會(huì)創(chuàng)建新的數(shù)組(原始數(shù)據(jù)的一個(gè)拷貝),即使兩個(gè)類(lèi)型一致
  • .tolist( ):將數(shù)組或者矩陣轉(zhuǎn)換成列表

但請(qǐng)注意深度分割函數(shù)dsplit的使用條件:

import numpy as np
arr=np.arange(12)
arr.shape = (4, 3)
print('\n', arr)

輸出:

[[ 0 1 2]

[ 3 4 5]

[ 6 7 8]

[ 9 10 11]]

print('形狀改變后, ndarray arr的維度為:',arr.ndim)

輸出:形狀改變后,ndarray arr的維度為:2

'''
dsplit分割的ndarray必須是三維ndarray,
且分割的數(shù)目必須為shape屬性中下標(biāo)為2的值的公約數(shù)。
比如這里的分割數(shù)就是36,下標(biāo)為2的值是4,符合要求
'''
arr = np.arange(36).reshape(3,3,4)
print('創(chuàng)建的三維ndarrary arr為:\n',arr)

創(chuàng)建的三維 ndarrary arr為:

[[[ 0 1 2 3]

[ 4 5 6 7]

[ 8 9 10 11]]

[[ 12 13 14 15]

[ 16 17 18 19]

[ 20 21 22 23]]

[[ 24 25 26 27]

[ 28 29 30 31]

[ 32 33 34 35]]]

1. 排序與搜索

書(shū)中已經(jīng)介紹了6種基本函數(shù)和它們的代碼演示:

  • 使用sort函數(shù)進(jìn)行排序
  • 使用argsort函數(shù)進(jìn)行排序
  • 使用argmax和argmin函數(shù)進(jìn)行搜索
  • 使用where函數(shù)無(wú)x與y
  • 使用where函數(shù)有x與y
  • 使用extract函數(shù)進(jìn)行搜索

在這里做幾點(diǎn)補(bǔ)充和說(shuō)明:

其中注意argsort函數(shù)使用的方法類(lèi)似于sort,只是返回的值不同,返回的是ndarray arr的下標(biāo)。

2. 字符串操作

Numpy的char模塊提供的字符串操作函數(shù)可以運(yùn)用向量化運(yùn)算來(lái)處理整個(gè)ndarray,而完成同樣的任務(wù),Python的列表則通常借助循環(huán)語(yǔ)句遍歷列表,并對(duì)逐個(gè)元素進(jìn)行相應(yīng)的處理。

Numpy的char模塊提供的常用字符串操作函數(shù)具有字符串的連接、切片、刪除、替換、字母大小寫(xiě)轉(zhuǎn)換和編碼調(diào)用等功能,可謂是十分方便,書(shū)上有非常詳細(xì)的介紹,建議大家結(jié)合《Python 3智能數(shù)據(jù)分析快速入門(mén)》這本書(shū)美味食用。

03 ufunc

ufunc,全稱通用函數(shù)(universal function),是一種能夠?qū)darray中所有元素進(jìn)行操作的函數(shù),而不是對(duì)ndarray對(duì)象操作。

  • ufunc的廣播機(jī)制

廣播(Broadingcasting)是指不同形狀的ndarray之間執(zhí)行算術(shù)運(yùn)算的方式。若兩個(gè)ndarray的shape不一致,Numpy則會(huì)實(shí)行廣播機(jī)制。為了更好地使用廣播機(jī)制,需要遵循4個(gè)原則。原則及案例在書(shū)上第159頁(yè)有詳細(xì)演示,此處不再贅述。

  • 常用ufunc

常用的ufunc運(yùn)算有算數(shù)運(yùn)算、三角函數(shù)、集合運(yùn)算、比較運(yùn)算、邏輯運(yùn)算和統(tǒng)計(jì)計(jì)算等。書(shū)上提供了若干種常用函數(shù),對(duì)ndarray中所有元素的運(yùn)算來(lái)說(shuō),在提供了極其方便與快捷的同時(shí),又囊括一切強(qiáng)大的功能。相關(guān)函數(shù)及案例在書(shū)上第161頁(yè)有詳細(xì)演示,此處不再贅述。

04 matrix與線性代數(shù)

Numpy的matrix是繼承自Numpy的二維ndarray對(duì)象,不僅擁有二維ndarray的屬性、方法與函數(shù),還擁有諸多特有的屬性與方法。同時(shí),Numpy中的matrix與線性代數(shù)中的矩陣概念幾乎完全相同,同樣含有轉(zhuǎn)置矩陣、共軛矩陣、逆矩陣等概念。

只要是大學(xué)期間學(xué)過(guò)《線性代數(shù)》這門(mén)課程的同學(xué),對(duì)于《Python 3智能數(shù)據(jù)分析快速入門(mén)》的學(xué)習(xí)完全沒(méi)有問(wèn)題,相關(guān)專(zhuān)業(yè)術(shù)語(yǔ)及技術(shù)實(shí)現(xiàn)細(xì)節(jié)在本節(jié)中都有強(qiáng)調(diào)。詳情請(qǐng)從第169頁(yè)開(kāi)始學(xué)習(xí)。

05 Numpy文件讀寫(xiě)

讀寫(xiě)文件是利用Numpy進(jìn)行數(shù)據(jù)處理的基礎(chǔ),Numpy中主要有二進(jìn)制的文件讀寫(xiě)和文件列表形式的數(shù)據(jù)讀寫(xiě)兩種形式。其中二進(jìn)制文件讀取使用書(shū)上第175頁(yè)中提到的load函數(shù);二進(jìn)制文件存儲(chǔ)使用save和savez函數(shù)。

但是在實(shí)際的數(shù)據(jù)分析任務(wù)中,更多使用文本格式的數(shù)據(jù),如txt或csv,因此經(jīng)常使用loadtxt函數(shù)執(zhí)行對(duì)文本格式的數(shù)據(jù)的讀取任務(wù)和savetxt函數(shù)執(zhí)行對(duì)文本格式的數(shù)據(jù)的存儲(chǔ)任務(wù)。

但是它們只能有效存取一維和二維數(shù)據(jù),這里我再對(duì)多維數(shù)據(jù)的存取的方法進(jìn)行補(bǔ)充:

a.tofile(frame, sep='', format='%s')

  • frame:文件、字符串
  • sep:數(shù)據(jù)分割字符串,如果是空串,寫(xiě)入文件為二進(jìn)制
  • format:寫(xiě)入數(shù)據(jù)的格式

np.fromfile(frame, dtype=float, count=‐1, sep='')

  • frame:文件、字符串
  • dtype:讀取的數(shù)據(jù)類(lèi)型
  • count:讀入元素個(gè)數(shù),‐1表示讀入整個(gè)文件
  • sep:數(shù)據(jù)分割字符串,如果是空串,寫(xiě)入文件為二進(jìn)制

需要注意的是,該方法需要讀取時(shí)知道存入文件時(shí)數(shù)組的維度和元素類(lèi)型,a.tofile()和np.fromfile()需要配合使用,可以通過(guò)元數(shù)據(jù)文件來(lái)存儲(chǔ)額外信息。

參考文獻(xiàn):

1. 《Python 3智能數(shù)據(jù)分析快速入門(mén)》 李明江、張良均、周東平、張尚佳 著,機(jī)械工業(yè)出版社出版。

2.中國(guó)大學(xué)MOOC,《Python數(shù)據(jù)分析與展示》作者:嵩天 。

3.百度百科:數(shù)組維數(shù)

4.CSDN:《花式索引與np.ix_函數(shù)》TzeSing 著

5.CSDN:《關(guān)于np.empty()函數(shù)的用法》愛(ài)數(shù)據(jù)的橙子 著

數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼

若不方便掃碼,搜微信號(hào):CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對(duì)象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺(tái)檢測(cè)極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說(shuō)明請(qǐng)參見(jiàn):http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請(qǐng)輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請(qǐng)輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }