iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 27
1
Software Development

糊裡糊塗Python就上手系列 第 27

[2020鐵人賽Day27]糊裡糊塗Python就上手-Numpy的觀念與運用(下)

今日目標

上篇僅介紹如何將數值轉換為 Numpy array 的方法與其中的使用方式,這邊要來提一下如何將數值取出呈現與如何統計運算

Numpy narray 運用

取得一維陣列的數值

一維陣列中元素排列的順序就是取值的索引,也可設置起始索引跟終止索引來取得一個範圍值,其取值的語法為:

narray[索引]
or
narray[起始索引 : 終止索引 [:間隔值]]

建立一個範圍值 0~7 的陣列值,並印出各種取值的方式(詳細可看 Code 的註解):
完整代碼

import numpy as np
arangeValue = np.arange(0,8)

print(arangeValue) # 印出所有值
print(arangeValue[:]) # 印出所有值
print(arangeValue[3]) # 印出索引位置 3 的值
print(arangeValue[3:7]) # 印出索引位置 3~7 的值(不包含7)
print(arangeValue[3:8:2]) # 印出索引位置 3~8 每間隔 2 的值
print(arangeValue[6:2:-1]) # 印出索引 6~2 的值,間隔值為負號代表由右至左讀取

https://ithelp.ithome.com.tw/upload/images/20201012/20091333gMj80qSrus.png

取得多維陣列的數值

二維陣列取值:
可以看作是使用 row 以及 col 的位置數當索引,就如同像是座標來找尋數值的位置,其語法為:

narray[row 索引, col 索引]

(單一索引範圍使用「:」區隔)

建立一個二維陣列值,並印出各種取值的方式(詳細可看 Code 的註解)
完整代碼

import numpy as np
list_data =[[1, 2, 3, 4],
            [5, 6, 7, 8],
            [9, 10, 11, 12],
            [13, 14, 15, 16]]

numpyArray = np.array(list_data)

print(numpyArray) # 印出全部
print(numpyArray[::]) # 印出全部
print(numpyArray[1, 2]) # row:1, col:2, result:7
print(numpyArray[3, 2:4]) # row:3, col:2:4, result:[15 16]
print(numpyArray[2:4, 2:4]) # row:2:4, col:2:4, result:[[11 12] [15 16]]
print(numpyArray[:, 2:4]) # row:all, col:2:4, result:[[ 3  4] [ 7  8] [11 12] [15 16]]
print(numpyArray[2:4, :]) # row:2:4, col:all, result:[[ 9 10 11 12] [13 14 15 16]]

https://ithelp.ithome.com.tw/upload/images/20201012/20091333076HEFT9HP.png

三維陣列取值:
其實跟二維陣列差不多使用方式,僅多了矩陣(matrix)數量,其語法為:

narray[matrix 索引, row 索引, col 索引]

建立一個三維陣列值,並印出各種取值的方式(詳細可看 Code 的註解)
完整代碼

import numpy as np

import numpy as np
list_data =[
    [[1, 2, 3, 4],
     [5, 6, 7, 8],
     [9, 10, 11, 12],
     [13, 14, 15, 16]],
    [[14, 18, 13, 12],
     [25, 26, 27, 28],
     [39, 30, 31, 32],
     [43, 44, 45, 46]],
]

numpyArray = np.array(list_data)
print("維度:", numpyArray.ndim)
print("形狀:", numpyArray.shape)
print("數量:", numpyArray.size)
print('\n')
print(numpyArray[::]) # 印出全部
print(numpyArray[1, 3, 2]) # matrix:1, row:3, col:2, result:45
print(numpyArray[0, 1:3, 3]) # matrix:1, row:3, col:2, result:[ 8 12]
print(numpyArray[:, 1:3, 3]) # matrix:all, row:3, col:2, result:[[ 8 12] [28 32]]

https://ithelp.ithome.com.tw/upload/images/20201012/20091333gmTfUSPe8H.png

取得產生的隨機資料(Numpy random)

在 Python 數據分析的學習應用過程中,經常需要用到 Numpy random 隨機函數,因此這邊需要提到一下

random 隨機函數 說明
rand() 根據給予的維度形狀,產生 0~1 之間的隨機浮點數資料(不包含 1 )
randn() 根據給予的維度形狀,返回標準常態分佈的隨機浮點數資料
randint(最小值[, 最大值, size]) 返回隨機整數,會依照所設定的最大最小值範圍區間,返回所要求的隨機整數(包含最小值,不包含最大值)
random(size) 根據給予的維度形狀 size,產生 0~1 之間的隨機浮點數資料
random_sample(size) 根據給予的維度形狀 size,產生 0~1 之間的隨機浮點數資料
sample(size) 根據給予的維度形狀 size,產生 0~1 之間的隨機浮點數資料
ranf(size) 根據給予的維度形狀 size,產生 0~1 之間的隨機浮點數資料
choice(array, size[,replace=True]) 從給予的一維陣列中,根據給予的維度形狀 size 返回隨機整數;這邊參數 replace=True 代表會返回重複的資料

實際體驗
並印出各種取值的方式(詳細可看 Code 的註解)
完整代碼

import numpy as np

print("產生印出 (4x2) 隨機資料:\n", np.random.rand(4,2), "\n")
print("產生印出 (4x2) 常態分布隨機資料:\n", np.random.randn(4,2), "\n")
print("產生印出 3個 0~1 之間的浮點數資料:\n", np.random.random(3), "\n")
print("產生印出 11~25,8 個隨機整數:\n", np.random.randint(11, 25, 8), "\n")
print("產生印出 7個 0~29 不重複的隨機整數:\n", np.random.choice(30, 7, replace=False), "\n")

https://ithelp.ithome.com.tw/upload/images/20201012/20091333QlXrDo2xwF.png

讀取 CSV 取得數值

通常在實際應用上都是使用 CSV 將數據儲存起來,而 Numpy 可以使用 genfromtxt 函數讀取檔案內容,並將內容轉換為陣列,語法為:

np.genfromtxt('資料檔名', delimiter='分隔符號', skip_header=略過行數)

實際體驗
讀取「day27.csv」的內容,並印出來呈現
關於此範例用的「day27.csv」可於這邊下載:day27.csv
完整代碼

import numpy as np

fileValue = np.genfromtxt('day27.csv', delimiter=',', skip_header=1)
print(fileValue) # 印出取得數值
print(fileValue.shape) # 印出形狀

https://ithelp.ithome.com.tw/upload/images/20201012/20091333V0b4ZcsPFe.png

Numpy 排序

在 Python Numpy 有資料排序 soft() 及 資料排序的索引 argsoft()
numpy.soft():對陣列中的值進行排序並回傳結果
numpy.argsoft():對陣列中的值進行排序並回索引

使用「day27.csv」,直接做排序
完整代碼

import numpy as np

fileValue = np.genfromtxt('day27.csv', delimiter=',', skip_header=1)

print("印出排序前的陣列:\n", fileValue, "\n") # 印出取得數值
print("印出排序後的陣列:\n", np.sort(fileValue), "\n") # 印出排序後的陣列
print("印出排序後的索引:\n", np.argsort(fileValue)) # 印出排序後的索引

https://ithelp.ithome.com.tw/upload/images/20201012/20091333g2ngUKUxhc.png

Numpy 常用運算與統計函數

運算函數 說明
sum 加總
prod 乘積
mean 平均值
max 最大值
min 最小值

使用「day27.csv」,並印出上述運算函數的數值
(axis為軸向,axis=0 代表行, axis=1 代表列)
完整代碼

import numpy as np

fileValue = np.genfromtxt('day27.csv', delimiter=',', skip_header=1)
print("印出取得數值:\n", fileValue, "\n") # 印出取得數值
print("取得最大值:", np.max(fileValue)) # 取得最大值
print("取得最小值:", np.min(fileValue)) # 取得最小值

# axis=0 行, axis=1 列
print("取得「每行最大值」:", np.max(fileValue, axis=0)) # 取得每行最大值
print("取得「每列最小值」:", np.min(fileValue, axis=1)) # 取得每列最小值

print("取得「每行加總」後數值:", np.sum(fileValue, axis=0)) # 取得每行加總後數值
print("取得「每列加總」後數值:", np.sum(fileValue, axis=1)) # 取得每列加總後數值

print("取得「每行乘積」後數值:", np.prod(fileValue, axis=0)) # 取得每行乘積後數值
print("取得「每列乘積」後數值:", np.prod(fileValue, axis=1)) # 取得每列乘積後數值

print("取得「每行平均」後數值:", np.mean(fileValue, axis=0)) # 取得每行平均值後數值
print("取得「每列平均」後數值:", np.mean(fileValue, axis=1)) # 取得每列平均值後數值

https://ithelp.ithome.com.tw/upload/images/20201012/20091333w53fBNEyX9.png

統計函數 說明
std 標準差
var 變異數
median 中位數
percentile 百分比
ptp 最大值與最小值差值

使用randint(),產生隨機 20 個整數值,並印出上述統計函數的數值
完整代碼

import numpy as np

numpyArray = np.random.randint(50, size=20)

print("隨機產出的數值為:\n", numpyArray)

print("取得「標準差」:", np.std(numpyArray)) # 取得標準差
print("取得「變異數」:", np.var(numpyArray)) # 取得變異數
print("取得「中位數」:", np.median(numpyArray)) # 取得中位數
print("取得「百分比」:", np.percentile(numpyArray, 100)) # 取得百分比
print("取得「最大值與最小值差值」:", np.ptp(numpyArray)) # 取得最大值與最小值差值

https://ithelp.ithome.com.tw/upload/images/20201012/20091333MarowFBwuZ.png

結論

此系列的 Python Numpy 介紹到這吿一段落
文章每個部分都盡量搭配實作,讓在實作的過程中瞭解到各個函數的作用,同時也加深印象,使得可快速熟悉運用


上一篇
[2020鐵人賽Day26]糊裡糊塗Python就上手-Numpy的觀念與運用(上)
下一篇
[2020鐵人賽Day28]糊裡糊塗Python就上手-Pandas的觀念與運用(上)
系列文
糊裡糊塗Python就上手30

尚未有邦友留言

立即登入留言