用于表示數(shù)據(jù)
1. NumPy庫入門
在cmd命令安裝NumPy包
pip install -i https://mirrors.aliyun.com/pypi/simple/ NumPy
python中調(diào)用NumPy庫介袜,運行沒有報錯纤泵,說明安裝完成
import numpy as np
as np:將import的numpy給出一個別名,即引入模塊的別名叮叹。這里可以去掉as np,也可將np改成其他的名字
盡管別名可以省略或者更改,但是建議使用上述約定的別名
1.1 數(shù)據(jù)的維度
維度:一組數(shù)據(jù)的組織形式
一維數(shù)據(jù):由對等關(guān)系的有序或無序數(shù)據(jù)構(gòu)成玄呛,一般采用線性方式組織。對應(yīng)列表和二、數(shù)組徘铝、集合等概念
列表和數(shù)組:都是表示一組數(shù)據(jù)的有序結(jié)構(gòu)。列表的數(shù)據(jù)類型可以不同惯吕,數(shù)組的數(shù)據(jù)類型相同
二維數(shù)據(jù):由多個一維數(shù)據(jù)構(gòu)成惕它,是一維數(shù)據(jù)的組合形式。表格是電信的二維數(shù)據(jù)废登,其中表頭可以是二維數(shù)據(jù)的一部分淹魄,也可是之外的部分
多維數(shù)據(jù):由一維或二維數(shù)據(jù)在新維度上擴展而形成的
高維數(shù)據(jù):僅利用最基本的二元關(guān)系展示數(shù)據(jù)間的復(fù)雜結(jié)構(gòu)。對應(yīng)鍵值對堡距,如湖南-長沙甲锡、陜西-西安等
類型 | 數(shù)據(jù)的Python表示 | |
---|---|---|
一維數(shù)據(jù) | 列表 | [1, 2, 3](有序) |
一維數(shù)據(jù) | 集合 | {1, 2, 3}(無序) |
二維/多維 | 列表 | [[1, 2, 3], [1, 2, 3]] |
高維數(shù)據(jù)字典 | 字典 | {'鍵' : '值', '鍵' : '值'} |
高維數(shù)據(jù)字典 | 數(shù)據(jù)表示格式 | JSON、XML吏颖、YAML |
1.2 ndarray
ndarray是NumPy中的數(shù)組類型
1.2.1 NumPy:開源的Python科學(xué)計算基礎(chǔ)庫
1)提供一個強大的N維數(shù)組對象ndarray搔体,也叫數(shù)組
2)提供一組廣播功能的函數(shù),用于數(shù)組之間計算
3)整合C/C++/Fortran代碼半醉,并且提供整合這些代碼的工具
4)提供線性代數(shù)疚俱、傅里葉變換、隨機數(shù)生成等功能
1.2.2 ndarray:N維數(shù)組對象
# ndarray對象定義
import numpy as np
a = np.arary([1, 2])
a = np.arary([[1, 2], [1,2]]) # 用[]將數(shù)據(jù)括起來
用以下例子表明numpy和正常運算的區(qū)別:計算A2+B3缩多,A呆奕、B是一維數(shù)組
'''正常運算'''
def pySum():
a = [0, 1, 2, 3, 4]
b = [9, 8, 7, 6, 5]
c = []
for i in range(len(a)):
c.append(a[i]**2 + b[i]**3)
return c
print(pySum()) # [729, 513, 347, 225, 141]
'''numpy方法'''
import numpy as np
def npSum():
# 用np.array生成一個數(shù)組ab
a = np.array([0, 1, 2, 3, 4])
b = np.array([9, 8, 7, 6, 5])
c = a**2 + b**3
return c
print(npSum()) # [729, 513, 347, 225, 141]
- 數(shù)組對象可以去掉元素間運算所需的循環(huán),使一維數(shù)據(jù)更像單個數(shù)據(jù)
- 設(shè)置專門的數(shù)組對象衬吆,提示運算速度
- 在科學(xué)計算中梁钾,一個維度所有數(shù)據(jù)的類型往往相同。所以數(shù)組對象采用相同的數(shù)據(jù)類型逊抡,有利于節(jié)省運算和存儲空間
ndarray由2部分構(gòu)成:實際的數(shù)據(jù)姆泻、表述這些數(shù)據(jù)的元數(shù)據(jù)(數(shù)據(jù)維度零酪、數(shù)據(jù)類型等)
ndarray要求所以有元素類型相同(同質(zhì)),數(shù)組下標從0開始
'''ndarray實例'''
import numpy as np
# 用np.arrary定義一個ndarray數(shù)組拇勃。ndarray在程序中的別名就是array
a = np.array([[0, 1, 2, 3, 4], [9, 8, 7, 6, 5]])
a # 直接顯示時四苇,會用array()來表明數(shù)組類型(如下圖)
print(a) # 打印時用[]來表示維度關(guān)系,元素間以空格來分離
1.2.3 ndarray屬性
ndarray的2個基本概念:1)軸(axis):保存數(shù)據(jù)的維度方咆;2)秩(rank):軸的數(shù)量月腋,或者維度的數(shù)量,即數(shù)組有多少個維度
軸和秩是描述ndarray類型的基本向量和方式
ndarray屬性 | 說明 |
---|---|
.ndim |
秩 |
.shape |
尺度瓣赂,對于矩陣n行m列 |
.size |
元素個數(shù)榆骚,相當于.shape 中n*m的值 |
.dtype |
元素類型 |
.itemsize |
每個元素大小,以字節(jié)為單位 |
import numpy as np
a = np.array([[0, 1, 2, 3, 4], [9, 8, 7, 6, 5]])
a.ndim # 2
a.shape # (2, 5)
a.size # 10
a.dtype # dtype('int32')【int32在基礎(chǔ)的Python語法中并不存在煌集,他是numpy定義的元素類型(具體見下表)】
a.itemsize # 4
ndarray元素類型
元素類型 | 說明 | 元素類型 | 說明 |
---|---|---|---|
bool | 布爾類型妓肢,True或False | uint8 | 8位無符號整數(shù),取值:[0, 225] |
intp | 用于索引的整數(shù) | uint16 | 16位無符號整數(shù)牙勘,取值:[0, 65535] |
intc | int32或int64 | uint32 | 32位無符號整數(shù)职恳,取值:[0, 2^32-1] |
int8 | 8位字節(jié)長度的整數(shù),取值:[-128, 127] | uint64 | 8位無符號整數(shù)方面,取值:[0, 2^64-1] |
int16 | 16位長度的整數(shù)放钦,取值:[-32768, 32767] | float16 | 16位半精度浮點數(shù):1位符號位,5位指數(shù)恭金,10位尾數(shù) |
int32 | 32位長度的整數(shù)操禀,取值:[-2^31, 2^31-1] | float32 | 32位半精度浮點數(shù):1位符號位,8位指數(shù)横腿,23位尾數(shù) |
inte64 | 字節(jié)長度的整數(shù)颓屑,取值:[-2^63, 2^63-1] | float64 | 64位半精度浮點數(shù):1位符號位,11位指數(shù)耿焊,52位尾數(shù) |
complex64 | 復(fù)數(shù)類型揪惦,實部和虛部都是32位浮點數(shù) | complex128 | 復(fù)數(shù)類型,實部和虛部都是64位浮點數(shù) |
Python語法僅支持整數(shù)罗侯、浮點數(shù)和復(fù)數(shù)3種數(shù)據(jù)類型
ndarray的元素多樣性
- 能夠符合在科學(xué)計算(數(shù)據(jù)多)對存儲和性能的高要求
- 對元素類型精細定義器腋,有助于NumPy合理使用存儲空間并優(yōu)化性能,且有助于程序員對程序的規(guī)模合理評估
ndarray最好是同質(zhì)的數(shù)組類型钩杰,但也可以包含非同質(zhì)的元素(如下代碼)
import numpy as np
a = np.array([[0, 1, 2, 3, 4], [9, 8, 7, 6]])
a # array([list([0, 1, 2, 3, 4]), list([9, 8, 7, 6])], dtype=object)
a.ndim # 1
# .shape只看到2個元素纫塌,但是沒有進一步分析
a.shape # (2,)
a.size # 2
# 非同質(zhì)ndarray,將每個元素認為是一個對象類型(dtype('0'))
a.dtype # dtype('0')
a.itemsize # 8
非同質(zhì)ndarray無法發(fā)揮UnmPy的優(yōu)勢讲弄,應(yīng)該盡量避免
1.3 數(shù)組創(chuàng)建
ndarray數(shù)組創(chuàng)建方法
- Python中的列表措左、元組
- NumPy中的函數(shù)
- 字節(jié)流(raw bytes)
- 從文件中讀取特定格式
1.3.1 從Python中的列表、元組創(chuàng)建ndarray數(shù)組
import numpy as np
# 直接將列表避除、元組當相關(guān)參數(shù)輸入給np.array()函數(shù)
# 可以用dtype指定每個元素的數(shù)據(jù)類型【如果不指定怎披,NumPy將根據(jù)讀入的數(shù)據(jù)關(guān)聯(lián)一個dtype類型】
a = np.array(list/tuple, dtype = np.float34)
只要元組和列表包含的數(shù)據(jù)個數(shù)相同胸嘁,可以將列表和元組回合,一起混合使用钳枕,來創(chuàng)建
1.3.2 使用NumPy中的函數(shù)創(chuàng)建ndarray數(shù)組
函數(shù) | 說明 |
---|---|
np.arange(n) | 類似range()缴渊,返回ndarray類型赏壹,元素從0-n-1(整數(shù)類型) |
np.ones(shape) | 根據(jù)shape生成一個全1數(shù)組鱼炒,shape是元組類型(浮點數(shù)類型) |
np.zeros(shape) | 根據(jù)shape生成一個全0數(shù)組,shape是元組類型(浮點數(shù)類型) |
np.full(shape,val) | 根據(jù)shape生成一個數(shù)組蝌借,每個元素值都是val |
np.eye(n) | 創(chuàng)建一個正方的n*n單位矩陣昔瞧,對角線為1,其余為0(浮點數(shù)類型) |
np.arange(10) # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
np.ones((3,6))
# Out[]: array([[1., 1., 1., 1., 1., 1.],
# [1., 1., 1., 1., 1., 1.],
# [1., 1., 1., 1., 1., 1.]])
np.zeros((3, 6), dtype=np.int32)
# Out[]: array([[0, 0, 0, 0, 0, 0],
# [0, 0, 0, 0, 0, 0],
# [0, 0, 0, 0, 0, 0]])
np.eye(3)
# Out[]: array([[1., 0., 0.],
# [0., 1., 0.],
# [0., 0., 1.]])
# 生成多維數(shù)組菩佑。最外層有2個元素自晰,每個元素有3個維度,每個維度有4個元素
x = np.ones((2,3,4))
x
# Out[]: array([[[1., 1., 1., 1.],
# [1., 1., 1., 1.],
# [1., 1., 1., 1.]],
# [[1., 1., 1., 1.],
# [1., 1., 1., 1.],
# [1., 1., 1., 1.]]])
x.shape # (2,3,4)[shape是由最外層到最內(nèi)層表示]
np.full((2,3,4), 25, dtype=np.int)
# array([[[25, 25, 25, 25],
# [25, 25, 25, 25],
# [25, 25, 25, 25]],
# [[25, 25, 25, 25],
# [25, 25, 25, 25],
# [25, 25, 25, 25]]])
函數(shù) | 說明 |
---|---|
np.ones_like(a) |
根據(jù)數(shù)組a的形狀生成一個全1數(shù)組 |
np.zeros_like(a) |
根據(jù)數(shù)組a的形狀生成一個全0數(shù)組 |
np.full_like(a, val) |
根據(jù)數(shù)組a的形狀生成一個全val數(shù)組 |
np.linspace() |
根據(jù)起止數(shù)據(jù)等間距地填充數(shù)據(jù) |
np.concatenate() |
將2個或多個數(shù)組合并成1個新數(shù)組 |
a = np.linspace(1, 10, 4)
a # array([ 1., 4., 7., 10.])[起始分別為1稍坯,10酬荞,一共4個數(shù)據(jù)),不限定數(shù)據(jù)類型時瞧哟,生成的是浮點數(shù)]
# endpoint表示最后一個元素10是否是元素中的一個
b = np.linspace(1, 10, 4, endpoint = False)
b # array([1. , 3.25, 5.5 , 7.75])[在1-10之間等間距的生成一個新的值]
c = np.concatenate((a, b))
c # array([ 1. , 4. , 7. , 10. , 1. , 3.25, 5.5 , 7.75])
1.4 數(shù)組變換
維度變換
方法 | 說明 |
---|---|
.reshape(shape) | 不改變數(shù)組元素混巧,返回一個shape形狀的新數(shù)組(保證元素總體個數(shù)不發(fā)生改變) |
.resize(shape) | 與.reshape(shape)類似,但是替換原數(shù)組 |
.swapaxces(ax1, ax2) | 將數(shù)組n個維度中的2個維度進行調(diào)換 |
.flatten() | 對數(shù)組進行降維勤揩,返回折疊后的一維數(shù)組咧党,原數(shù)組不變 |
a = np.ones((2,3,4), dtype=np.int32)
a
# array([[[1, 1, 1, 1],
# [1, 1, 1, 1],
# [1, 1, 1, 1]],
# [[1, 1, 1, 1],
# [1, 1, 1, 1],
# [1, 1, 1, 1]]])
# 將3維數(shù)組變?yōu)?維數(shù)組。都是24個元素個數(shù)陨亡,a未改變
a.reshape(3, 8)
# Out[]: array([[1, 1, 1, 1, 1, 1, 1, 1],
# [1, 1, 1, 1, 1, 1, 1, 1],
# [1, 1, 1, 1, 1, 1, 1, 1]])
# a已改變
a.resize(3, 8)
a
# Out[]: array([[1, 1, 1, 1, 1, 1, 1, 1],
# [1, 1, 1, 1, 1, 1, 1, 1],
# [1, 1, 1, 1, 1, 1, 1, 1]])
a.flatten()
# Out[]: array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])
astype()
類型變換
# np.int:程序會將元素解析為整數(shù)類型傍衡,是int32還是int64,是由程序自動調(diào)節(jié)
a = np.ones((2,3,4), dtype=np.int)
a
# np.float代表一類浮點數(shù)類型
b = a.astype(np.float)
b
# array([[[1., 1., 1., 1.],
# [1., 1., 1., 1.],
# [1., 1., 1., 1.]],
# [[1., 1., 1., 1.],
# [1., 1., 1., 1.],
# [1., 1., 1., 1.]]])
astype()
方法一定會創(chuàng)建一個新的數(shù)組负蠕,即使定義一個與原數(shù)組類型相同的數(shù)組蛙埂,也會有一個新的數(shù)組,即可利用這個特性進行拷貝數(shù)組
a.tolist()
方法將ndarray數(shù)組向列表轉(zhuǎn)換
a = np.full((2,3,4), 25, dtype=np.int)
a
a.tolist() # [[[25, 25, 25, 25], [25, 25, 25, 25], [25, 25, 25, 25]], [[25, 25, 25, 25], [25, 25, 25, 25], [25, 25, 25, 25]]]
列表時Python中最原始的數(shù)據(jù)類型遮糖,可能在空間和運算速度比NumPy慢很多绣的。但是更適合傳統(tǒng)的或者原生的Python語言語法
1.4 ndarray操作
對數(shù)組的索引:獲取數(shù)組中特定位置元素的過程
對數(shù)組的切片:獲取數(shù)組元素子集的過程
一維數(shù)組的索引和切片(與python列表相似)
import numpy as np
a = np.array([1, 2, 3, 4, 5])
a[2] # 3
# 切片,[開始編號:終止編號(不含):步長]
a[1 : 4 : 2] # array([2, 4])
a # array([1, 2, 3, 4, 5])
多維數(shù)組的索引和切片
a = np.arange(24).reshape((2, 3, 4))
a
# array([[[ 0, 1, 2, 3],
# [ 4, 5, 6, 7],
# [ 8, 9, 10, 11]],
# [[12, 13, 14, 15],
# [16, 17, 18, 19],
# [20, 21, 22, 23]]])
# 索引,每個維度使用逗號分隔,[第一維度止吁,第二維度被辑,第三維度]
a[1, 2, 3] # 23
a[0, -1, 1] # 9
# 切片,不考慮第一維度,第二維度是1敬惦,第三維度是-3的元素
a[:, 1, -3] # array([ 5, 17])
# 切片盼理,第一維度是1,第三維度是所有范圍俄删,但是以2為步長
a[1, :, :: 2]
# array([[12, 14],
# [16, 18],
# [20, 22]])
1.5 ndarray運算
數(shù)組與標量之間的運算:運算作用于數(shù)組的每一個元素
a = np.arange(12).reshape((2, 3, 2))
# 平均值
a.mean() # 5.5
# 相除
a / a.mean()
# array([[[0. , 0.18181818],
# [0.36363636, 0.54545455],
# [0.72727273, 0.90909091]],
# [[1.09090909, 1.27272727],
# [1.45454545, 1.63636364],
# [1.81818182, 2. ]]])
NumPy一元函數(shù):對ndarray中的數(shù)據(jù)執(zhí)行元素級運算的函數(shù)
函數(shù) | 說明 |
---|---|
np.abs(x) np.fabs(x)
|
計算數(shù)組x各元素的絕對值 |
np.sqrt(x) np.square(x)
|
計算數(shù)組x元各素的平方根宏怔、平方 |
np.log(x) np.log(10) np.log2(x)
|
計算數(shù)組x各元素的自然對數(shù)奏路、10底對數(shù)、2底對數(shù) |
np.ceil(x) np.floor(x)
|
計算數(shù)組x各元素的ceiling值(大于元素的最小整數(shù)值)臊诊、floor值(小于元素的最大整數(shù)值) |
np.rint(x) |
計算數(shù)組x各元素的四舍五入 |
np.modf(x) |
將數(shù)組x各元素的小數(shù)部分和整數(shù)部分以2個獨立數(shù)組返回 |
np.cos(x) np.cosh(x) np.sin(x) np.sinh(x) np.tan(x) np.tanh(x)
|
計算數(shù)組x各元素的普通型和雙曲線型三角函數(shù) |
np.exp(x) |
計算數(shù)組x各元素的指數(shù)值 |
np.sign(x) |
計算數(shù)組x各元素的符號值鸽粉,1(+),0抓艳,-1(-) |
a = np.array([[1.1, 2.1, 3.6], [2.5, 5.9, 4.1]])
np.ceil(a)
# array([[2., 3., 4.],
# [3., 6., 5.]])
np.floor(a)
# array([[1., 2., 3.],
# [2., 5., 4.]])
np.modf(a)
# (array([[0.1, 0.1, 0.6],
# [0.5, 0.9, 0.1]]), array([[1., 2., 3.],
# [2., 5., 4.]]))
np.exp(np.array([1, 2, 3])) # array([ 2.71828183, 7.3890561 , 20.08553692])
在使用數(shù)組時触机,一定要注意原數(shù)組是否被真實改變,
一元函數(shù)幾乎都是只改變輸出結(jié)果玷或,不改變原數(shù)組(要改變需要重新賦值)
NumPy的二元函數(shù) | 說明 |
---|---|
+ - * / **
|
2個數(shù)組各元素進行對應(yīng)運算 |
np.maximum(x,y) np.fmax() np.miximum(x,y) np.fmix()
|
元素級的最大值/最小值計算 |
np.mod(x,y) |
元素級的模運算 |
np.copysign(x,y) |
將數(shù)組y中個元素值的符號賦值給數(shù)組x |
< > =< => == !=
|
算術(shù)比較儡首,產(chǎn)生布爾型數(shù)組 |
a = np.array([[1.1, 2.1, 3.6], [2.5, 5.9, 4.1]])
b = np.array([[1, 2, 3], [4, 5, 6]])
np.maximum(a, b)
# array([[1.1, 2.1, 3.6],
# [4. , 5.9, 6. ]])
np.fmax(a, b)
# array([[1.1, 2.1, 3.6],
# [4. , 5.9, 6. ]])
a > b
# array([[ True, True, True],
# [False, True, False]])
np.mod(a, b)
# array([[0.1, 0.1, 0.6],
# [2.5, 0.9, 4.1]])
2. NumPy數(shù)據(jù)存取
2.1 一、二維
CSV(Comma-Separated Value)逗號分隔值
一種文件格式偏友,用來存儲批量數(shù)據(jù)
將數(shù)據(jù)寫入CSV文件(將數(shù)據(jù)保存為CSV文件)
np.savetxt(frame, array, fmt = '%.18e', delimiter = None)
frame
:文件蔬胯、字符串或產(chǎn)生器,可以是.gz或.bz的壓縮包
array
:存入文件的數(shù)組
fmt
:寫入文件的格式位他,例如%d(整數(shù))氛濒、%.2f(保留2個小數(shù)點)、%.18e(科學(xué)計算法鹅髓,保留18位小數(shù)點的浮點數(shù))
delimiter
:分割字符串舞竿,默認是任何空格(寫入CSV需呀改成逗號)
a = np.arange(100).reshape(5, 20)
np.savetxt('a.csv', a, fmt = '%d', delimiter=',') # 【在python運行目錄下生成相應(yīng)的a.csv文件,包含維度信息】
讀入csv文件
np.loadtxt(frame, dtype = np.float, delimiter = None, unpack = False)
dtype
:數(shù)據(jù)類型迈勋,可選np.int
unpack
:False讀入文件寫入一個數(shù)組炬灭,如果True,讀入屬性將分別寫入不同變量
b = np.loadtxt('a.csv', delimiter=',')
局限性:只能有效存儲一維和二維數(shù)組
2.2 多維數(shù)組
寫入/存儲多維數(shù)組
a.tofile(frame, sep = '', format = '%s')
frame
:文件靡菇、字符串
sep
:數(shù)據(jù)分隔字符串重归,如果是空串,寫入文件為二進制
format
: 寫入數(shù)據(jù)的格式
a = np.arange(100).reshape(5, 10, 2)
a.tofile('b.dat', sep = ',', format = '%d') # 【在python運行目錄下生成相應(yīng)的b.dat文件厦凤,不包含維度信息)
讀入多維數(shù)據(jù)文件
np.fromfile(frame, dtype = np.float, count = -1, sep = '')
count
:讀入元素個數(shù)鼻吮,-1表示讀入整個文件
c = np.fromfile('b.dat', dtype = np.int, sep = ',')
c # 【一維數(shù)組,沒有維度信息】
c.reshape(5, 10, 2)
tofile()
寫入多維數(shù)組较鼓,維度信息消失椎木,讀取后需要重新定義維度信息
存入是需要知道數(shù)組的維度信息和元素類型
2.3 便捷文件存儲
# 存入(有原數(shù)組的維度信息)
np.save(frame, array)
np.savez(frame, array)
# 讀取(有原數(shù)組的維度信息)
np.load(frame)
frame
:文件名博烂,以.npy為擴展名香椎,壓縮擴展名為.npz
a = np.arange(100).reshape(5, 10, 2)
np.save('a.npy', a)
b = np.load('a.npy')
這個方法是以二進制 存儲文件,第一行為數(shù)組的原始信息(包括維度)
3. NumPy函數(shù)
3.1 隨機數(shù)函數(shù)
NumPy的random子庫禽篱,能夠提供隨機數(shù)畜伐,調(diào)用方法np.random.
常用隨機數(shù)函數(shù) | 說明 |
---|---|
randint(low,high, (shape)) |
根據(jù)shape創(chuàng)建隨機整數(shù)數(shù)組,范圍[low,high) |
seed(s) |
隨機數(shù)種子躺率,s是給定的種子值 |
np.random.randint(100, 200, (5,))
# array([111, 128, 174, 188, 109])【一維數(shù)組創(chuàng)建】
np.random.randint(100, 200, (2,3))
# array([[109, 115, 164],
# [128, 189, 193]])
np.random.seed(10)
np.random.randint(100, 200, (2,3))
# array([[109, 115, 164],
# [128, 189, 193]])
np.random.seed(10)
np.random.randint(100, 200, (2,3))
# array([[109, 115, 164],
# [128, 189, 193]])
通過重復(fù)給定隨機數(shù)種子玛界,可以生成同一個隨機數(shù)組
高級隨機數(shù)函數(shù) | 說明 |
---|---|
shuffle(a) |
根據(jù)數(shù)組a的第0軸(最外維度)進行隨機排列万矾,改變數(shù)組a |
permutation(a) |
根據(jù)數(shù)組a的第0軸進行隨機排列,產(chǎn)生一個新數(shù)組慎框,不改變數(shù)組a |
choice(a,size,replace,p) |
從一維數(shù)組a中以概率p抽取元素良狈,形成size形狀的新數(shù)組,replace表示是否可以重用元素笨枯,默認為Ture |
a = np.random.randint(100, 200, (2,3))
a
# array([[127, 118, 193],
# [177, 122, 123]])
np.random.shuffle(a)
a
# array([[177, 122, 123],
# [127, 118, 193]])【數(shù)組改變】
np.random.permutation(a) # 【不改變數(shù)組】
# array([[127, 118, 193],
# [177, 122, 123]])
a
# array([[177, 122, 123],
# [127, 118, 193]])
b = np.random.randint(100, 200, (5,))
b
# array([105, 104, 171, 188, 188])
np.random.choice(b,(2,2))
# array([[171, 188],
# [171, 105]])
np.random.choice(b,(2,2),p = b/np.sum(b))
# array([[171, 104],
# [171, 105]]) 【設(shè)定的這個概率使得越大的數(shù)抽到的概率越大】
分布式隨機數(shù)函數(shù) | 說明 |
---|---|
rand(d0,d1,...,dn) |
產(chǎn)生浮點數(shù)[0,1)的均勻分布的數(shù)組薪丁,d0-dn是維度信息 |
uniform(low, high, size) |
產(chǎn)生具有均勻分布的數(shù)組 |
randn(d0,d1,...,dn) |
產(chǎn)生數(shù)值是標準正態(tài)分布的數(shù)組,d0-dn是維度信息 |
normal(loc, scale,size) |
產(chǎn)生具有正太分布的數(shù)組猎醇,loc均值窥突,scale標準差 |
poisson(lam, size) |
產(chǎn)生具有泊松分布的數(shù)組,lam隨機事件發(fā)生概率 |
np.random.rand(2, 3)
# array([[0.37447814, 0.03649257, 0.4805653 ],
# [0.48993116, 0.41622894, 0.5778854 ]])
np.random.randn(2,3)
# array([[-0.70733753, -1.97096895, 0.9567542 ],
# [ 1.09554293, 1.52540993, -0.84229966]])
np.random.uniform(1, 10, (2,2))
# array([[1.35353591, 4.21463583],
# [1.71651781, 3.74913927]])
np.random.normal(10, 5, (2,2))
# array([[15.64392577, 6.51094985],
# [ 9.59438908, 7.3535196 ]])
3.2 統(tǒng)計函數(shù)
NumPy直接提供統(tǒng)計函數(shù)硫嘶,調(diào)用方法np.
常用統(tǒng)計函數(shù) | 說明 |
---|---|
sum(a, axis = None) |
根據(jù)給定軸axis計算數(shù)組a相關(guān)元素之和 |
mean(a, axis = None) |
根據(jù)給定軸axis計算數(shù)組a相關(guān)元素的期望 |
average(a,axis=None,weights=None) |
根據(jù)給定軸axis計算數(shù)組a相關(guān)元素的加權(quán)平均值 |
std(a, axis = None) |
根據(jù)給定軸axis計算數(shù)組a相關(guān)元素的標準差 |
var(a, axis = None) |
根據(jù)給定軸axis計算數(shù)組a相關(guān)元素的方差 |
axis
= None是統(tǒng)計函數(shù)的標配參數(shù),axis
是整數(shù)或元組
a = np.arange(24).reshape(2,3,4)
a
# array([[[ 0, 1, 2, 3],
# [ 4, 5, 6, 7],
# [ 8, 9, 10, 11]],
# [[12, 13, 14, 15],
# [16, 17, 18, 19],
# [20, 21, 22, 23]]])
np.sum(a) # 276
# 第一維度上梧税,相對應(yīng)的元素相加沦疾,得到一個第二維度和第三維度的數(shù)組
# 本例中,第一維度有2個第队,第1個第一維度+第2個第一維度
np.sum(a, axis = 0)
# array([[12, 14, 16, 18],
# [20, 22, 24, 26],
# [28, 30, 32, 34]])
# 第二維度上哮塞,相對應(yīng)的元素相加,得到一個第一維度和第三維度的數(shù)組
# 本例中凳谦,第二維度有3個忆畅,在第1個第一維度中:第1個第二維度+第2個第二維度+第3個第二維度;在第2個第一維度中亦然
np.sum(a, axis = 1)
# array([[12, 15, 18, 21],
# [48, 51, 54, 57]])
# 第三維度上尸执,相對應(yīng)的元素相加家凯,得到一個第一維度和第二維度的數(shù)組
np.sum(a, axis = 2)
# array([[ 6, 22, 38],
# [54, 70, 86]])
axis
= 0,紅框數(shù)字運算
axis
= 1如失,藍框數(shù)字運算
axis
= 2绊诲,黃框數(shù)字運算
np.average(a,axis=1)
# array([[ 4., 5., 6., 7.],
# [16., 17., 18., 19.]])
# 軸為1時,是第二維度數(shù)據(jù)褪贵,第二維度有3個掂之,所有需要分別指出其加權(quán)力度
np.average(a,axis=1, weights=[2,4,6])
# array([[ 5.33333333, 6.33333333, 7.33333333, 8.33333333],
# [17.33333333, 18.33333333, 19.33333333, 20.33333333]])
加權(quán)平均數(shù)=元素*相應(yīng)加權(quán)之和/權(quán)重之和
不設(shè)定時,默認哥權(quán)重為1脆丁,即平均值
其他統(tǒng)計函數(shù) | 說明 |
---|---|
min(a) max(a)
|
計算數(shù)組a中元素的最小世舰、大值 |
argmin(a) argmax(a)
|
計算數(shù)組a中元素最小、大值的降一維下標(即獲得最小槽卫、大值的一維位置) |
unravel_index(index,shape) |
根據(jù)shape將一維下標的index裝換成多維下標 |
ptp(a) |
計算數(shù)組a中元素最大值與最小值差 |
median(a) |
計算數(shù)組a中元素中位數(shù)的運算(中值) |
np.argmax(a) # 23
np.unravel_index(np.argmax(a), a.shape) # (1, 2, 3)
axis
= 0跟压,黑框,第1個第一維度
axis
= 1晒夹,紅框裆馒,第1個第二維度
axis
= 2姊氓,綠框,第4個第三維度
3.3 階梯函數(shù)
np.gradient(a)
:計算數(shù)組a中的梯度喷好,當a為多維數(shù)組時翔横,返回每個維度梯度
梯度:連續(xù)值之間的變化率,即斜率梗搅。反應(yīng)元素的變化率
在XY坐標抽連續(xù)三個X坐標應(yīng)用的Y軸值:a,b,c禾唁,b的梯度是(c-a)/2
對于2個頂點數(shù)值,是(當前數(shù)值-隔壁數(shù)值)/1
import numpy as np
a = np.random.randint(0, 20,(5))
a # array([ 2, 19, 15, 12, 19])
np.gradient(a) # array([17. , 6.5, -3.5, 2. , 7. ])
b = np.arange(24).reshape(2,3,4)
np.gradient(b)
# [array([[[12., 12., 12., 12.],
# [12., 12., 12., 12.],
# [12., 12., 12., 12.]],
# [[12., 12., 12., 12.],
# [12., 12., 12., 12.],
# [12., 12., 12., 12.]]]),【數(shù)組在第一維度(紅框)梯度值】
# array([[[4., 4., 4., 4.],
# [4., 4., 4., 4.],
# [4., 4., 4., 4.]],
# [[4., 4., 4., 4.],
# [4., 4., 4., 4.],
# [4., 4., 4., 4.]]]), 【數(shù)組在第二維度(藍框)梯度值】
# array([[[1., 1., 1., 1.],
# [1., 1., 1., 1.],
# [1., 1., 1., 1.]],
# [[1., 1., 1., 1.],
# [1., 1., 1., 1.],
# [1., 1., 1., 1.]]])] 【數(shù)組在第三維度(黃框)梯度值】
4. 圖像的手繪
4.1 圖像的數(shù)組
RBG色彩模式:通過顏色通道變化和疊加得到各種顏色无切,形成的顏色包括人類實例所能感知的所有顏色
- R紅色:0-255
- G綠色:0-255
- B藍色:0-255
PIL庫(Python Image Library):具有強大圖像處理能的第三方庫
# 安裝
pip install pillow
# 導(dǎo)入
from PIL import Image
Image
:是PIL庫中代表一個圖像的類(對象)
圖像的數(shù)組表示:由像素組成的三維矩陣荡短,每個元素是一個RGB值
from PIL import Image
import numpy as np
# 將打開的圖片生成一個數(shù)組
im = np.array(Image.open('E:\TDRDIS Book\編程\Python應(yīng)用\pig\數(shù)據(jù)算法途徑.jpg'))
# 打印維度和類型
print(im.shape, im.dtype) # (1136, 2122, 3) uint8
維度分別是高度、寬度哆键、像素RGB值構(gòu)成
4.2 圖像的變換
from PIL import Image
import numpy as np
# 讀入圖像掘托,并獲得RGB值數(shù)組
im = np.array(Image.open('E:\\TDRDIS Book\\編程\\Python應(yīng)用\\pig\\111.jpg'))
# 改變數(shù)組像素,計算補值
a = [255, 255, 255] - im
# 將數(shù)組生成圖像對象
im_a = Image.fromarray(a.astype('uint8'))
# 保存圖像
im_a.save('E:\\TDRDIS Book\\編程\\Python應(yīng)用\\pig\\111_a.jpg') # 【獲得圖片】
convert(L)
將彩色變換成灰色圖片籍嘹,生成的數(shù)組時一個二維數(shù)組闪盔,對應(yīng)的值是灰度值,不是RGB值
im = np.array(Image.open('E:\\TDRDIS Book\\編程\\Python應(yīng)用\\pig\\aaa.jpg').convert('L'))
# 灰度值取反
b = 255 - im
im_a = Image.fromarray(b.astype('uint8'))
im_a.save('E:\\TDRDIS Book\\編程\\Python應(yīng)用\\pig\\aaa_b.jpg')
# 區(qū)間變化辱士,對當前圖片的灰度值做一個區(qū)間壓縮泪掀,再擴充一個區(qū)間范圍(150)
c = (100/255)*im + 150
im_a = Image.fromarray(b.astype('uint8'))
im_a.save('E:\\TDRDIS Book\\編程\\Python應(yīng)用\\pig\\aaa_c.jpg')
# 像素平方
d = 255*(a/255)**2
im_a = Image.fromarray(b.astype('uint8'))
im_a.save('E:\\TDRDIS Book\\編程\\Python應(yīng)用\\pig\\aaa_d.jpg')
4.3 圖形的手繪
手繪效果特點:
- 黑白灰色
- 邊界線較重
- 相同或相近色彩趨于白色
- 略有光源效果:根據(jù)灰度變化模擬人類視覺的遠近程度
from PIL import Image
import numpy as np
a = np.array(Image.open('E:\\TDRDIS Book\\編程\\Python應(yīng)用\\pig\\doctor.jpg').convert('L')).astype('float')
# 預(yù)設(shè)虛擬深度值為10【取值范圍是(0-100)】
depth = 10.
# 取圖像灰度的梯度值
grad = np.gradient(a)
# 分別取橫縱圖像梯度值
grad_x, grad_y = grad
# 根據(jù)深度調(diào)整xy方向的梯度值【添加深度對于梯度的影響因素】
# /100對深度值進行歸一化
grad_x = grad_x*depth/100.
grad_y = grad_y*depth/100.
# 構(gòu)造xy梯度的三維歸一化單位坐標系
A = np.sqrt(grad_x**2 + grad_y**2 + 1.)
# 繼續(xù)整體歸一化,uni_x颂碘、uni_y异赫、uni_z表示圖像平面的單位法向量
uni_x = grad_x/A
uni_y = grad_y/A
uni_z = 1./A
# 光源的俯視角度,弧度值
vec_el = np.pi/2.2
# 光源的方位角度头岔,弧度值
vec_az = np.pi/4.
# 光源對xyz 軸的影響塔拳,np.cos(vec_el)在個方向上的投影長度
# dx,sy,dz可以看做光源在坐標中的表示
dx = np.cos(vec_el)*np.cos(vec_az)
dy = np.cos(vec_el)*np.sin(vec_az)
dz = np.sin(vec_el)
# 光源歸一化【梯度與光源相互作用,將梯度轉(zhuǎn)化為灰度】
b = 255*(dx*uni_x + dy*uni_y + dz*uni_z)
# 之前各種歸一化切油,都是為了將影響因子局限在0-1之間蝙斜,以免投影到梯度范圍內(nèi),產(chǎn)生溢出澎胡,但也有不可避免的
# 為了避免數(shù)據(jù)越界(溢出)孕荠,將生產(chǎn)的灰度值裁剪至0-255
# clip()舍棄掉少許溢出的灰度值
b = b.clip(0,255)
# 重構(gòu)圖像
im = Image.fromarray(b.astype('uint8'))
im.save('E:\\TDRDIS Book\\編程\\Python應(yīng)用\\pig\\doctor_手繪.jpg')
利用像素之間的梯度值和虛擬深度值對圖像進行重構(gòu)
根據(jù)灰度變化來模擬人類視覺的明暗程度
目錄:Python數(shù)據(jù)分析與展示
一、NumPy庫
二攻谁、Matplotlib庫
三稚伍、Pandas庫