Python數(shù)據(jù)分析的起手式(4)Numpy入門

本文內(nèi)容整理自DataCamp課程之 Intro to Python for Data Science.

本系列將包括以下內(nèi)容:

訪問 我的github 可下載本文對應(yīng)的notebook以及練習(xí)答案驹饺,便于親手實(shí)踐。


注意:本文代碼基于Python3版本。如果要在python2中執(zhí)行,需要先導(dǎo)入_future_模塊。

#僅在Python2中使用
#from __future__ import division
#from __future__ import print_function

1. 一維數(shù)組

我們在第2講提到的列表(list)具有非常強(qiáng)大的功能,但卻不能很好滿足數(shù)據(jù)分析的要求:實(shí)現(xiàn)高速且大量的數(shù)學(xué)運(yùn)算。

用列表分別記錄身高和體重這兩組數(shù)據(jù)业踢,我們嘗試一下是否能用它來直接計(jì)算BMI指數(shù)。

height = [1.73, 1.68, 1.71, 1.89, 1.79]  #身高列表
weight = [65.4, 59.2, 63.6, 88.4, 68.7]  #體重列表
bmi = weight / height ** 2  #計(jì)算BMI指數(shù)
bmi

---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-1-b6ce7d301f86> in <module>()
1 height = [1.73, 1.68, 1.71, 1.89, 1.79] #身高列表
2 weight = [65.4, 59.2, 63.6, 88.4, 68.7] #體重列表
----> 3 bmi = weight / height ** 2 #計(jì)算BMI指數(shù)
4 bmi
TypeError: unsupported operand type(s) for ** or pow(): 'list' and 'int'

以上錯誤告訴我們礁扮,列表不能實(shí)現(xiàn)整體的數(shù)學(xué)運(yùn)算知举,這正是它的局限。那么該如何有效解決呢太伊?

Python 中有專門的數(shù)值計(jì)算基礎(chǔ)包 Numpy雇锡,它是 Numeric Python 的縮寫。Numpy提供的數(shù)組(array)可以很好地替代 Python 列表僚焦,不僅可以實(shí)現(xiàn)整體運(yùn)算锰提,而且還非常簡單快速。

那么就讓我們用 Numpy 數(shù)組來實(shí)現(xiàn)上面列表無法完成的BMI指數(shù)計(jì)算吧。

import numpy as np  #導(dǎo)入numpy 包
np_height = np.array(height)  #創(chuàng)建身高的numpy數(shù)組
np_height

array([ 1.73, 1.68, 1.71, 1.89, 1.79])

np_weight = np.array(weight)  #創(chuàng)建體重的numpy數(shù)組
np_weight

array([ 65.4, 59.2, 63.6, 88.4, 68.7])

bmi = np_weight / np_height ** 2  #計(jì)算BMI指數(shù)
bmi

array([ 21.85171573, 20.97505669, 21.75028214, 24.7473475 , 21.44127836])

列表元素可以是任何類型立肘,但是 Numpy 數(shù)組元素必須是相同類型边坤。下面的例子說明,如果使用了不同的數(shù)據(jù)類型谅年,則會被強(qiáng)制轉(zhuǎn)化成同一種茧痒。

np.array([1.0, "is", True])

array(['1.0', 'is', 'True'], dtype='<U32')

加號 + 在列表和 Numpy 數(shù)組中的作用也是不一樣的。在列表中融蹂,加號實(shí)現(xiàn)列表的拼接旺订;而在 Numpy 數(shù)組中,加號則是進(jìn)行對應(yīng)元素的加法運(yùn)算殿较。

python_list = [1, 2, 3]
python_list + python_list

[1, 2, 3, 1, 2, 3]

numpy_array = np.array([1, 2, 3])
numpy_array + numpy_array

array([2, 4, 6])

切片操作耸峭,Numpy 數(shù)組與 Python 列表類似桩蓉。

bmi[1]

20.975056689342409

bmi[1:4]

array([ 20.97505669, 21.75028214, 24.7473475 ])

但 Numpy 數(shù)組能做的遠(yuǎn)不止這些淋纲,比如要找到bmi大于23的數(shù),該怎么做呢院究?

bmi > 23

array([False, False, False, True, False], dtype=bool)

首先我們得到一個布爾變量組成的數(shù)組洽瞬,然后試著將它放入bmi[ ]中會有什么效果?

bmi[bmi > 23]

array([ 24.7473475])

于是我們得到了想要的結(jié)果业汰,可見伙窃,Numpy 數(shù)組是多么強(qiáng)大呀!

練習(xí)4-1:

你的第一個 Numpy 數(shù)組:棒球運(yùn)動員的身高數(shù)據(jù)样漆。

# 創(chuàng)建棒球運(yùn)動員的身高列表 baseball
baseball = [180, 215, 210, 210, 188, 176, 209, 200]

# 導(dǎo)入numpy包

# 用列表baseball創(chuàng)建numpy數(shù)組:np_baseball

# 打印np_baseball的數(shù)據(jù)類型

# 將以厘米為單位的身高轉(zhuǎn)換成以米為單位

# 找出高于2米的運(yùn)動員身高數(shù)據(jù)

# 打印輸出最后一個棒球運(yùn)動員的身高

# 打印輸出最后兩個運(yùn)動員的身高

2. 二維數(shù)組

Numpy 數(shù)組不僅限于一維为障,也可以是多維的。比如創(chuàng)建一個身高放祟、體重的二維數(shù)組鳍怨。

np_2d = np.array([[1.73, 1.68, 1.71, 1.89, 1.79],
                  [65.4, 59.2, 63.6, 88.4, 68.7]])
np_2d

array([[ 1.73, 1.68, 1.71, 1.89, 1.79], [ 65.4 , 59.2 , 63.6 , 88.4 , 68.7 ]])

np_2d.shape

(2, 5)

這是一個2行、5列的二維數(shù)組跪妥,第一行代表身高鞋喇,第二行代表體重。索引結(jié)構(gòu)如下圖所示:

Numpy 數(shù)組

了解了索引的結(jié)構(gòu)眉撵,就可以進(jìn)行切片操作了侦香。

np_2d[0] #選取第1行

array([ 1.73, 1.68, 1.71, 1.89, 1.79])

np_2d[0][2] #選取第1行第3列

1.71

np_2d[0,2] #選取第1行第3列的另一種方法

1.71

np_2d[:,1:3] #選取每一行的第2、3列

array([[ 1.68, 1.71], [ 59.2 , 63.6 ]])

np_2d[1,:] #選取第2行的所有列

array([ 65.4, 59.2, 63.6, 88.4, 68.7])

另外纽疟,二維數(shù)組的運(yùn)算也很有意思罐韩,仔細(xì)觀察下面的示例。

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

array([[ 2, 4], [ 6, 8], [10, 12]])

np_mat + np.array([10, 10])

array([[11, 12], [13, 14], [15, 16]])

np_mat + np_mat

array([[ 2, 4], [ 6, 8], [10, 12]])

練習(xí)4-2:

你的第一個 Numpy 二維數(shù)組:棒球運(yùn)動員的身高污朽、體重?cái)?shù)據(jù)散吵。

# 創(chuàng)建二維列表 baseball, 第一列是身高,第二列是體重
baseball = [[180, 78.4],
            [215, 102.7],
            [210, 98.5],
            [188, 75.2]]

#導(dǎo)入 numpy 基礎(chǔ)包

# 用二維列表baseball創(chuàng)建二維數(shù)組 np_baseball

# 打印輸出 np_baseball 的類型

# 打印輸出 np_baseball的shape屬性

# 打印輸出第3行的數(shù)據(jù)

# 打印輸出第二列體總數(shù)據(jù)

# 打印輸出第4名運(yùn)動員的身高

3. 基礎(chǔ)統(tǒng)計(jì)

分析的第一步,是觀察了解數(shù)據(jù)错蝴。對于少量數(shù)據(jù)洲愤,也許看一眼就行了,但是對于大量數(shù)據(jù)顷锰,就需要用到統(tǒng)計(jì)的知識了柬赐。Numpy 中有非常豐富的統(tǒng)計(jì)工具,那就讓我們一起來看看吧官紫。

下面的例子中肛宋,我們收集到棒球運(yùn)動員的一組數(shù)據(jù),每一行代表一位選手的數(shù)據(jù)束世,每一列所代表的是體重酝陈、身高、年齡信息毁涉。

sample = np.array([
       [  74.  ,  215.  ,   34.69],
       [  72.  ,  210.  ,   30.78],
       [  72.  ,  210.  ,   35.43],
       [  73.  ,  188.  ,   35.71],
       [  69.  ,  176.  ,   29.39],
       [  69.  ,  209.  ,   30.77],
       [  71.  ,  200.  ,   35.07],
       [  76.  ,  231.  ,   30.19],
       [  71.  ,  180.  ,   27.05],
       [  73.  ,  188.  ,   23.88],
       [  73.  ,  180.  ,   26.96],
       [  74.  ,  185.  ,   23.29],
       [  74.  ,  160.  ,   26.11],
       [  69.  ,  180.  ,   27.55],
       [  70.  ,  185.  ,   34.27],
       [  73.  ,  189.  ,   27.99],
       [  75.  ,  185.  ,   22.38],
       [  78.  ,  219.  ,   22.89],
       [  79.  ,  230.  ,   25.76],
       [  76.  ,  205.  ,   36.33]])

首先沉帮,用切片的方法得到運(yùn)動員的身高數(shù)據(jù)。

height = sample[:,1]
height

array([ 215., 210., 210., 188., 176., 209., 200., 231., 180., 188., 180., 185., 160., 180., 185., 189., 185., 219., 230., 205.])

使用 np.mean() 函數(shù)計(jì)算身高的平均值:

np.mean(height)

196.25

使用 np.median() 函數(shù)計(jì)算身高的中位數(shù):

np.median(height)

188.5

使用 np.std() 函數(shù)計(jì)算身高的標(biāo)準(zhǔn)差:

np.std(height)

18.616860637604827

使用 np.corrcoef() 函數(shù)計(jì)算體重和身高的相關(guān)系數(shù):

np.corrcoef(sample[:,0], sample[:,1])

array([[ 1. , 0.50671793], [ 0.50671793, 1. ]])

使用 Numpy 還可以進(jìn)行統(tǒng)計(jì)模擬贫堰,生成隨機(jī)數(shù)或符合特定分布的數(shù)值穆壕。比如,下面的代碼生成了一組100個符合正態(tài)分布的數(shù)值其屏,均值是1.75喇勋,標(biāo)準(zhǔn)差是0.2。

data = np.round(np.random.normal(1.75, 0.20, size=100), 2)

sum()偎行、sort()這類的函數(shù)川背,Numpy 和 Python 中都有,那么它們的區(qū)別在哪里呢蛤袒?關(guān)鍵在于 Numpy 中的計(jì)算速度更快熄云,因?yàn)?Numpy 是專門針對數(shù)值計(jì)算的,而 Python 還要考慮其他數(shù)據(jù)類型汗盘。

sum(height)

3925.0

np.sum(height)

3925.0

練習(xí)4-3:

綜合練習(xí):找出足球運(yùn)動中守門員和其他運(yùn)動員的身高的中位數(shù)皱碘。

# 創(chuàng)建足球運(yùn)動員的位置和對應(yīng)的身高數(shù)據(jù)
positions = ['GK', 'M', 'A', 'D', 'M', 'D', 'M', 'M', 'M', 'A', 'M', 'M', 'A', 'A', 'A', 'M', 'D', 'A', 'D', 'M', 'GK', 'D', 'D', 'M', 'M', 'M', 'M', 'D', 'M', 'GK']
heights = [191, 184, 185, 180, 181, 187, 170, 179, 183, 186, 185, 170, 187, 183, 173, 188, 183, 180, 188, 175, 193, 180, 185, 170, 183, 173, 185, 185, 168, 190]

# 導(dǎo)入numpy包
import numpy as np

# 將列表 positions 和 heights 分別轉(zhuǎn)化成numpy數(shù)組: np_positions, np_heights

# 將守門員的身高數(shù)據(jù)存入變量 gk_heights, 守門員對應(yīng)的位置編碼是’GK‘
gk_heights = 

# 將守門員之外的其他運(yùn)動員的身高數(shù)據(jù)存入變量 other_heights
other_heights = 

# 打印輸出守門員身高的中位數(shù)隐孽,替換代碼中的'None'
print("Median height of goalkeepers: " + str(None))

# 打印輸出其他運(yùn)動員身高的中位數(shù)癌椿,替換代碼中的'None'
print("Median height of other players: " + str(None))

補(bǔ)充:

關(guān)于 我的github 中文件下載的方式:

  • 如果下載單個文件,點(diǎn)擊所要下載的文件菱阵,在新打開的頁面中找到右上方的 raw 按鈕踢俄,右擊另存為即可。另外文件名需要刪除后綴 .txt晴及,而保留原始格式后綴都办,如 .ipynb 。

  • 如果打包下載,回到github庫的根目錄中琳钉,點(diǎn)擊右上方綠色的 Clone and download 按鈕势木,選擇 Download ZIP 即可。

本文使用Jupyter notebook 編寫歌懒,關(guān)于它的說明和安裝方法啦桌,可以參考我之前的兩篇文章。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末甫男,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子验烧,更是在濱河造成了極大的恐慌板驳,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碍拆,死亡現(xiàn)場離奇詭異若治,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)倔监,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進(jìn)店門直砂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人浩习,你說我怎么就攤上這事〖们穑” “怎么了谱秽?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長摹迷。 經(jīng)常有香客問我疟赊,道長,這世上最難降的妖魔是什么峡碉? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任近哟,我火速辦了婚禮,結(jié)果婚禮上鲫寄,老公的妹妹穿的比我還像新娘吉执。我一直安慰自己,他們只是感情好地来,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布戳玫。 她就那樣靜靜地躺著,像睡著了一般未斑。 火紅的嫁衣襯著肌膚如雪咕宿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天,我揣著相機(jī)與錄音府阀,去河邊找鬼缆镣。 笑死,一個胖子當(dāng)著我的面吹牛试浙,可吹牛的內(nèi)容都是我干的费就。 我是一名探鬼主播,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼川队,長吁一口氣:“原來是場噩夢啊……” “哼力细!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起固额,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤眠蚂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后斗躏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逝慧,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年啄糙,在試婚紗的時候發(fā)現(xiàn)自己被綠了笛臣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡隧饼,死狀恐怖沈堡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情燕雁,我是刑警寧澤诞丽,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站拐格,受9級特大地震影響僧免,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜捏浊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一懂衩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧金踪,春花似錦浊洞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至姐军,卻和暖如春铁材,著一層夾襖步出監(jiān)牢的瞬間尖淘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工著觉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留村生,地道東北人。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓饼丘,卻偏偏與公主長得像趁桃,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子肄鸽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評論 2 348

推薦閱讀更多精彩內(nèi)容