[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 介绍到这吿一段落
文章每个部分都尽量搭配实作,让在实作的过程中了解到各个函数的作用,同时也加深印象,使得可快速熟悉运用


<<:  如何快速上手第三方套件

>>:  [Day 27]老师我学逻辑推论做什麽(2)

Day 20: 人工智慧在音乐领域的应用 (AI作曲-基因演算法三 突变)

昨天我们讲完了音乐间是如何彼此交配并生出子代,今天我们接着来讲出生後的子代必须面队的充满挑战的一生。...

【Day27】Figma篇 : 设计到切版

对於设计师来说使用UI设计软件,除了可以善用之前提到的那些设计工具来增加效率和提升设计方法以外,还有...

如何让 Laravel Eloquent 支援 composite key

Composite key 一般表 (table) 是只有一个主键 (primary key),而复...

单元测试-概念

督促自己每天学习的方法就是在健康情况允许的情况下,每天至少丢一篇正在学习中的文章 单元测试是甚麽 1...