
【導(dǎo)語】在數(shù)據(jù)分析當(dāng)中,python用到最多的第三方庫就是numpy,今天我們就來講講!
作者:王皓
來源:大數(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),簡稱數(shù)組(Array),是由相同類型的元素的集合所組成的數(shù)據(jù)結(jié)構(gòu),分配一塊連續(xù)的內(nèi)存來存儲。按數(shù)組維數(shù)分類可分為:一維數(shù)組、二維數(shù)組、多維數(shù)組(N維數(shù)組)。
numpy是最著名的 python庫之一,常用于高性能計(jì)算。Numpy提供了兩種基本對象:ndarray和ufunc。
NumPy作為一個(gè)開源的Python科學(xué)計(jì)算基礎(chǔ)庫,包含:一個(gè)強(qiáng)大的N維數(shù)組對象ndarray ;廣播功能函數(shù) ;整合C/C++/Fortran代碼的工具 ;線性代數(shù)、傅里葉變換、隨機(jī)數(shù)生成等功能。NumPy是SciPy、Pandas等數(shù)據(jù)處理或科學(xué)計(jì)算庫的基礎(chǔ)。
當(dāng)然這里就有一個(gè)問題出現(xiàn)了,Python已有列表類型,為什么需要一個(gè)數(shù)組對象(類型)?
因?yàn)椋?
但是Python內(nèi)置的array模塊既不支持多維數(shù)組功能,又沒有配套對應(yīng)的計(jì)算函數(shù),所以基于Numpy的ndarray在很大程度上改善了Python內(nèi)置array模塊的不足,將重點(diǎn)介紹ndarray的創(chuàng)建與索引。
1. 創(chuàng)建ndarray對象
1)ndarray數(shù)據(jù)類型
在《Python 3智能數(shù)據(jù)分析快速入門》該節(jié)內(nèi)容中,作者羅列了15種數(shù)據(jù)類型,其中實(shí)數(shù)數(shù)據(jù)類型13種。這些實(shí)數(shù)數(shù)據(jù)類型之間可以互相轉(zhuǎn)換。
這時(shí)有人會問,為什么要支持這么多種數(shù)據(jù)類型?是因?yàn)閷Ρ萈ython語法來說僅支持整數(shù)、浮點(diǎn)數(shù)和復(fù)數(shù)3種類型,但是當(dāng)科學(xué)計(jì)算涉及數(shù)據(jù)較多,對存儲和性能都有較高要求,所以對數(shù)據(jù)類型進(jìn)行精細(xì)定義,有助于NumPy合理使用存儲空間并優(yōu)化性能和程序員對程序規(guī)模有合理評估。
對于15種數(shù)據(jù)類型在這里筆者將不贅述,書上有詳細(xì)的解釋以及案例示范。
2)ndarray創(chuàng)建
在《Python 3智能數(shù)據(jù)分析快速入門》該節(jié)內(nèi)容中,作者介紹了兩種創(chuàng)建ndarray的方法:
這里筆者再補(bǔ)充四種方法并整理出來:
對于方法②再補(bǔ)充5個(gè)常用函數(shù):
3)隨機(jī)數(shù)
Numpy提供了強(qiáng)大的生成隨機(jī)數(shù)的功能,使用隨機(jī)數(shù)也能創(chuàng)建ndarray。基本語法格式:numpy.random.×××() 。在《Python 3智能數(shù)據(jù)分析快速入門》該節(jié)內(nèi)容中,作者羅列了13個(gè)函數(shù)及其說明,筆者再補(bǔ)充2個(gè)函數(shù):
2. ndarray的索引和切片
索引與切片是ndarray使用頻率最高的操作。相較于list,ndarray索引與切片在功能上更加豐富,在形式上更多樣。ndarray的高效率在很大程度上需歸功于其索引的易用性。
1)一維ndarray的索引
一維ndarray的索引方法很簡單,與list的索引方法一致,相關(guān)案例在書上有展示,這里不再贅述。
2)多維ndarray的索引
多維的每一個(gè)維度都有一個(gè)索引,各個(gè)維度的索引之間用逗號隔開,例如: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]]
#訪問第0行中第3列和第4列元素 print('切片結(jié)果:',arr[0,3:5])
輸出:
切片結(jié)果:[4 5]
#訪問第1行和第二行中第2列、第3列和第4列的元素 print('切片結(jié)果:\n',arr[1:,2:])
輸出:
切片結(jié)果:
[6 7 8]
[9 10 11]
#訪問第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ù)語,是在基礎(chǔ)索引方式之上衍生出的功能更強(qiáng)大的索引方式。它能夠利用整數(shù)ndarray進(jìn)行索引。
在這節(jié)的學(xué)習(xí)中,發(fā)現(xiàn)一個(gè)有趣的問題:在使用np.empty函數(shù)時(shí),本想用arr = np.empty((4,7))創(chuàng)建一個(gè)空的多維數(shù)組,但是返回的結(jié)果是這樣:
語法格式數(shù)值等都沒有什么錯(cuò)誤的情況下,初步懷疑是函數(shù)本身的原因,于是用help()函數(shù)查看它的詳細(xì)介紹,竟然查到了:
數(shù)據(jù)類型是可選且默認(rèn)值是numpy.float64。(好家伙,書上可沒告訴我)所以只需在后面選擇int就行。
arr = np.empty((4,7),int) print(arr)
輸出:
另一個(gè)問題是關(guān)于ix函數(shù)生成區(qū)域索引器的問題,代碼如下:
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]為什么會返回這樣一個(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,之后的以此類推。
02 ndarray的基礎(chǔ)操作
ndarray的基礎(chǔ)操作包括設(shè)置ndarray形狀、展平ndarray、組合ndarray、分割ndarray、ndarray的排序與搜索,以及ndarray的字符串操作等。
書中已經(jīng)介紹了12種基本函數(shù)和它們的代碼演示:
在這里做幾點(diǎn)補(bǔ)充和說明:
但請注意深度分割函數(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. 排序與搜索
書中已經(jīng)介紹了6種基本函數(shù)和它們的代碼演示:
在這里做幾點(diǎn)補(bǔ)充和說明:
其中注意argsort函數(shù)使用的方法類似于sort,只是返回的值不同,返回的是ndarray arr的下標(biāo)。
2. 字符串操作
Numpy的char模塊提供的字符串操作函數(shù)可以運(yùn)用向量化運(yùn)算來處理整個(gè)ndarray,而完成同樣的任務(wù),Python的列表則通常借助循環(huán)語句遍歷列表,并對逐個(gè)元素進(jìn)行相應(yīng)的處理。
Numpy的char模塊提供的常用字符串操作函數(shù)具有字符串的連接、切片、刪除、替換、字母大小寫轉(zhuǎn)換和編碼調(diào)用等功能,可謂是十分方便,書上有非常詳細(xì)的介紹,建議大家結(jié)合《Python 3智能數(shù)據(jù)分析快速入門》這本書美味食用。
03 ufunc
ufunc,全稱通用函數(shù)(universal function),是一種能夠?qū)darray中所有元素進(jìn)行操作的函數(shù),而不是對ndarray對象操作。
廣播(Broadingcasting)是指不同形狀的ndarray之間執(zhí)行算術(shù)運(yùn)算的方式。若兩個(gè)ndarray的shape不一致,Numpy則會實(shí)行廣播機(jī)制。為了更好地使用廣播機(jī)制,需要遵循4個(gè)原則。原則及案例在書上第159頁有詳細(xì)演示,此處不再贅述。
常用的ufunc運(yùn)算有算數(shù)運(yùn)算、三角函數(shù)、集合運(yùn)算、比較運(yùn)算、邏輯運(yùn)算和統(tǒng)計(jì)計(jì)算等。書上提供了若干種常用函數(shù),對ndarray中所有元素的運(yùn)算來說,在提供了極其方便與快捷的同時(shí),又囊括一切強(qiáng)大的功能。相關(guān)函數(shù)及案例在書上第161頁有詳細(xì)演示,此處不再贅述。
04 matrix與線性代數(shù)
Numpy的matrix是繼承自Numpy的二維ndarray對象,不僅擁有二維ndarray的屬性、方法與函數(shù),還擁有諸多特有的屬性與方法。同時(shí),Numpy中的matrix與線性代數(shù)中的矩陣概念幾乎完全相同,同樣含有轉(zhuǎn)置矩陣、共軛矩陣、逆矩陣等概念。
只要是大學(xué)期間學(xué)過《線性代數(shù)》這門課程的同學(xué),對于《Python 3智能數(shù)據(jù)分析快速入門》的學(xué)習(xí)完全沒有問題,相關(guān)專業(yè)術(shù)語及技術(shù)實(shí)現(xiàn)細(xì)節(jié)在本節(jié)中都有強(qiáng)調(diào)。詳情請從第169頁開始學(xué)習(xí)。
05 Numpy文件讀寫
讀寫文件是利用Numpy進(jìn)行數(shù)據(jù)處理的基礎(chǔ),Numpy中主要有二進(jìn)制的文件讀寫和文件列表形式的數(shù)據(jù)讀寫兩種形式。其中二進(jìn)制文件讀取使用書上第175頁中提到的load函數(shù);二進(jìn)制文件存儲使用save和savez函數(shù)。
但是在實(shí)際的數(shù)據(jù)分析任務(wù)中,更多使用文本格式的數(shù)據(jù),如txt或csv,因此經(jīng)常使用loadtxt函數(shù)執(zhí)行對文本格式的數(shù)據(jù)的讀取任務(wù)和savetxt函數(shù)執(zhí)行對文本格式的數(shù)據(jù)的存儲任務(wù)。
但是它們只能有效存取一維和二維數(shù)據(jù),這里我再對多維數(shù)據(jù)的存取的方法進(jìn)行補(bǔ)充:
a.tofile(frame, sep='', format='%s')
np.fromfile(frame, dtype=float, count=‐1, sep='')
需要注意的是,該方法需要讀取時(shí)知道存入文件時(shí)數(shù)組的維度和元素類型,a.tofile()和np.fromfile()需要配合使用,可以通過元數(shù)據(jù)文件來存儲額外信息。
參考文獻(xiàn):
1. 《Python 3智能數(shù)據(jù)分析快速入門》 李明江、張良均、周東平、張尚佳 著,機(jī)械工業(yè)出版社出版。
2.中國大學(xué)MOOC,《Python數(shù)據(jù)分析與展示》作者:嵩天 。
3.百度百科:數(shù)組維數(shù)
4.CSDN:《花式索引與np.ix_函數(shù)》TzeSing 著
5.CSDN:《關(guān)于np.empty()函數(shù)的用法》愛數(shù)據(jù)的橙子 著
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
SQL Server 中 CONVERT 函數(shù)的日期轉(zhuǎn)換:從基礎(chǔ)用法到實(shí)戰(zhàn)優(yōu)化 在 SQL Server 的數(shù)據(jù)處理中,日期格式轉(zhuǎn)換是高頻需求 —— 無論 ...
2025-09-18MySQL 大表拆分與關(guān)聯(lián)查詢效率:打破 “拆分必慢” 的認(rèn)知誤區(qū) 在 MySQL 數(shù)據(jù)庫管理中,“大表” 始終是性能優(yōu)化繞不開的話題。 ...
2025-09-18CDA 數(shù)據(jù)分析師:表結(jié)構(gòu)數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結(jié)構(gòu)數(shù)據(jù)(如數(shù)據(jù)庫表、Excel 表、CSV 文件)是企業(yè)數(shù)字 ...
2025-09-18DSGE 模型中的 Et:理性預(yù)期算子的內(nèi)涵、作用與應(yīng)用解析 動(dòng)態(tài)隨機(jī)一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結(jié)構(gòu)數(shù)據(jù)特征價(jià)值的專業(yè)核心 表結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲的結(jié)構(gòu)化數(shù)據(jù),如數(shù)據(jù)庫表、Excel 表、 ...
2025-09-17Excel 導(dǎo)入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實(shí)戰(zhàn)應(yīng)用 在用 Python(如 pandas 庫)處理 Excel 數(shù)據(jù)時(shí),“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗(yàn)與 t 檢驗(yàn):差異、適用場景與實(shí)踐應(yīng)用 在數(shù)據(jù)分析與統(tǒng)計(jì)學(xué)領(lǐng)域,假設(shè)檢驗(yàn)是驗(yàn)證研究假設(shè)、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結(jié)構(gòu)數(shù)據(jù)全功能周期的專業(yè)操盤手 表格結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 存儲的結(jié)構(gòu)化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計(jì)劃中 rows 數(shù)量的準(zhǔn)確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計(jì)劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對象的 text 與 content:區(qū)別、場景與實(shí)踐指南 在 Python 進(jìn)行 HTTP 網(wǎng)絡(luò)請求開發(fā)時(shí)(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價(jià)值的核心操盤手 表格結(jié)構(gòu)數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫表)是企業(yè)最基礎(chǔ)、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請求工具對比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長浮點(diǎn)數(shù)據(jù)的科學(xué)計(jì)數(shù)法問題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長浮點(diǎn)數(shù)據(jù)時(shí)的科學(xué)計(jì)數(shù)法問題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務(wù)數(shù)據(jù)分析步驟的落地者與價(jià)值優(yōu)化者 業(yè)務(wù)數(shù)據(jù)分析是企業(yè)解決日常運(yùn)營問題、提升執(zhí)行效率的核心手段,其價(jià)值 ...
2025-09-12用 SQL 驗(yàn)證業(yè)務(wù)邏輯:從規(guī)則拆解到數(shù)據(jù)把關(guān)的實(shí)戰(zhàn)指南 在業(yè)務(wù)系統(tǒng)落地過程中,“業(yè)務(wù)邏輯” 是連接 “需求設(shè)計(jì)” 與 “用戶體驗(yàn) ...
2025-09-11塔吉特百貨孕婦營銷案例:數(shù)據(jù)驅(qū)動(dòng)下的精準(zhǔn)零售革命與啟示 在零售行業(yè) “流量紅利見頂” 的當(dāng)下,精準(zhǔn)營銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務(wù)數(shù)據(jù)分析:概念辨析與協(xié)同價(jià)值 在數(shù)據(jù)驅(qū)動(dòng)決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務(wù)數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類分析:從操作實(shí)踐到業(yè)務(wù)價(jià)值挖掘 在數(shù)據(jù)分析場景中,聚類分析作為 “無監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計(jì)模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價(jià)值導(dǎo)向 統(tǒng)計(jì)模型作為數(shù)據(jù)分析的核心工具,并非簡單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10