【Python 核心庫(kù)】Numpy 實(shí)景教程與練習(xí)

NumPy 是 Python 科學(xué)計(jì)算中最常用的核心庫(kù)。它可以提供一系列高性能的多維數(shù)組對(duì)象,以及用于這些數(shù)組的工具。【劃重點(diǎn):數(shù)組接口是 Numpy 最重要的特性,沒(méi)有之一?!窟@篇教程以練代教,通過(guò)實(shí)操掌握知識(shí)點(diǎn)的學(xué)習(xí),確保大家能實(shí)際應(yīng)用所學(xué)的編程知識(shí)。畢竟,Practice Makes Perfect。
為什么學(xué)習(xí) Python 繞不開(kāi) Numpy?
把 NumPy 看起來(lái)可愛(ài)逗趣的名字拆開(kāi),人家其實(shí)非常正經(jīng)。NumPy 即 Numerical Python(數(shù)字化 Python)的縮寫(xiě)。簡(jiǎn)單來(lái)說(shuō),NumPy 是 Python 中的線性代數(shù)庫(kù),這就明示了 NumPy 在 Python 中的重要性了。
之所以說(shuō) NumPy 是 Python 中最常用也是最重要的核心庫(kù),是因?yàn)樵S多類(lèi)似 SciPy、Matplotlib、Scikit-learn、TensorFlow 等,都對(duì) NumPy 有一定程度的依賴(lài)。例如,TensorFlow 會(huì)在內(nèi)部使用 Numpy 來(lái)處理 Tensors 中的多項(xiàng)操作。
在處理數(shù)據(jù)科學(xué)或機(jī)器學(xué)習(xí)的過(guò)程中,NumPy 可以對(duì)數(shù)組提供數(shù)學(xué)和邏輯運(yùn)算,同時(shí)也在 Python 中對(duì) n 數(shù)組和矩陣操作提供各種不同的功能。
NumPy對(duì)于對(duì)數(shù)組進(jìn)行數(shù)學(xué)和邏輯運(yùn)算非常有用。它為Python中對(duì)n個(gè)數(shù)組和矩陣的操作提供了大量有用的功能。簡(jiǎn)單易用的 NumPy 可以簡(jiǎn)化復(fù)雜的數(shù)學(xué)實(shí)現(xiàn),讓編程概念變得更為數(shù)字化且易于理解,因此也廣泛使用于各種開(kāi)源項(xiàng)目中。
如何開(kāi)始使用 NumPy?
在 Python IDE 中使用教程的配套源代碼學(xué)習(xí) NumPy,只需要通過(guò) QuickFix 就可以一鍵安裝。更多關(guān)于 NumPy 模塊的安裝方式,可以查看如何手動(dòng)下載和安裝依賴(lài)。

【源碼傳送門(mén)】https://d1590a0dfb-share.lightly.teamcode.com
NumPy 跟練 1:修改學(xué)科成績(jī)曲線
前面曾提到數(shù)組是 NumPy 最核心的功能,也是最重要的特性。因此,第一階段的跟練內(nèi)容就是使用 numpy.array()
創(chuàng)建數(shù)組,然后通過(guò) NumPy 內(nèi)建的函數(shù)修改并計(jì)算數(shù)組中的內(nèi)容。
場(chǎng)景說(shuō)明
假設(shè)你是一名大學(xué)教師,你在最近的期末考中失手出了巨難的考題,因此學(xué)生的成績(jī)都不太理想。雖然如此,你很善良,不忍心大量學(xué)生因此掛科,所以你決定修改學(xué)科成績(jī)曲線,讓大家的分?jǐn)?shù)看起來(lái)合理一些。
你初次批改的卷面分分別為:[42, 35, 64, 85, 51, 72, 59, 12]
這么一看,8 個(gè)人就有 5 個(gè)掛,著實(shí)有點(diǎn)狠了。
解題
我們把這個(gè)分?jǐn)?shù)用 numpy.array()
導(dǎo)入,即numpy.array([42, 35, 64, 85, 51, 72, 59, 12])
。若使用 import numpy as np
,則應(yīng)在代碼中把 numpy.array()
改為 np.array()
。【注意:.array()
的括號(hào)內(nèi)需要再添加方括號(hào)?!?/p>
NumPy 中的數(shù)組會(huì)將數(shù)據(jù)元素儲(chǔ)存于毗鄰的儲(chǔ)存位置中,通過(guò)索引號(hào)直接訪問(wèn)。這里的數(shù)組為一維數(shù)組,隨著深入學(xué)習(xí),我們慢慢還會(huì)接觸二維數(shù)組 …… N 維數(shù)組等等。

【查看源碼】https://d1590a0dfb-share.lightly.teamcode.com
如果不使用 NumPy 處理成績(jī)曲線,我們需要重復(fù)為各個(gè)分?jǐn)?shù)進(jìn)行加分后,再進(jìn)行合計(jì)。NumPy 把這些數(shù)據(jù)組合成數(shù)組后,便可以對(duì)這些數(shù)據(jù)進(jìn)行統(tǒng)一處理,不僅去相對(duì)掉繁瑣的 for
循環(huán),讓代碼看起來(lái)更簡(jiǎn)潔明了,更減少了代碼出現(xiàn) bug 的概率。一般上,這個(gè)過(guò)程被稱(chēng)之為矢量化(vectorization)。
在這段代碼中,我們主要應(yīng)用了 NumPy 中自建的 .mean()
函數(shù)以及 .clip()
函數(shù)。前者即平均數(shù)(mean)的函數(shù),簡(jiǎn)單易懂。.clip()
函數(shù)則確保數(shù)組中的值不超過(guò)給定的上下限,clip 的意思是“修剪”,所以應(yīng)用到代碼中為:
numpy.clip(需要修剪的變量, 下限, 上限)
在修改分?jǐn)?shù)曲線時(shí),我們需要修剪的變量為 new_grades
,下限設(shè)置為不低于原先的分?jǐn)?shù)(否則還被降分的學(xué)生也太慘了),然后把上限設(shè)置為 100 分。畢竟,百分制的話 100 分就是上限了。如此一來(lái),直接使用老傳統(tǒng) print()
進(jìn)行打印,新的分?jǐn)?shù)就出來(lái)了。
剛開(kāi)始使用 NumPy 其實(shí)不太需要擔(dān)心各種各樣的函數(shù)眼花繚亂,也不需要擔(dān)心自己需要死背這些內(nèi)容,擁抱各類(lèi)模塊的文檔(documentation)就可以快速理解模塊中的各種函數(shù)功能。所以,這類(lèi)的文檔有時(shí)候也被稱(chēng)之為小抄(cheatsheet)或食譜(cookbook)。也就是說(shuō),合格的程序員必須要學(xué)會(huì)查找和閱讀 NumPy 的官方文檔。
NumPy 跟練 2:檢索學(xué)生班級(jí)與成績(jī)
上一個(gè)跟練的內(nèi)容為一維數(shù)組,這次我們來(lái)看看 NumPy 如何處理多維數(shù)組中的數(shù)據(jù)。
場(chǎng)景說(shuō)明
因?yàn)榕拇髮W(xué)的試卷太難了,你選擇退而求其次,考了教師資格證成為高中體育老師。這一次,我們要用 NumPy 分別記錄學(xué)生的姓名、班級(jí)和成績(jī)。
在這次的場(chǎng)景中,我們將應(yīng)用 NumPy 中的記錄數(shù)組(又稱(chēng)之為結(jié)構(gòu)化數(shù)組)。這類(lèi)數(shù)組可以為每一列指定數(shù)據(jù)類(lèi)別(例如:str 字符串、int 整數(shù)、bool 布爾運(yùn)算等)和名稱(chēng),讓數(shù)據(jù)篩選變得更簡(jiǎn)單強(qiáng)大。
我們來(lái)看看數(shù)據(jù)原材料:
這一看除了把名字排得特別整齊,其他班級(jí)和分?jǐn)?shù)不是亂七八糟嘛 …… 這不我們還得把學(xué)生按班級(jí)整理好,高分的同學(xué)該表?yè)P(yáng),低分的同學(xué)該批評(píng)一下嘛?
練習(xí)
上一個(gè)跟練我們直接給了標(biāo)準(zhǔn)答案,這一次還是需要大家自己動(dòng)手嘗試。放心,該有的提示和講解還是會(huì)有,但檢查答案前還是需要大家思考一下以下的題目:
使用 data[]
函數(shù),求:
低于及格分?jǐn)?shù)的學(xué)生姓名。
分?jǐn)?shù)最高的學(xué)生姓名、班級(jí)及分?jǐn)?shù)?!咎崾荆?code>np.max()】
各班級(jí)的學(xué)生姓名、班級(jí)及分?jǐn)?shù),需按分?jǐn)?shù)大小逆序排列?!咎崾荆?code>np.sort()】

同學(xué)們可以另開(kāi)新檔嘗試自己手動(dòng)做題,再查看源代碼中的 score2D.py
參考答案,在線查看并運(yùn)行項(xiàng)目:https://d1590a0dfb-share.lightly.teamcode.com