NumPy庫

用于表示數(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]
  1. 數(shù)組對象可以去掉元素間運算所需的循環(huán),使一維數(shù)據(jù)更像單個數(shù)據(jù)
  2. 設(shè)置專門的數(shù)組對象衬吆,提示運算速度
  3. 在科學(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)系,元素間以空格來分離
ndarray實例.png

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的元素多樣性

  1. 能夠符合在科學(xué)計算(數(shù)據(jù)多)對存儲和性能的高要求
  2. 對元素類型精細定義器腋,有助于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)建方法

  1. Python中的列表措左、元組
  2. NumPy中的函數(shù)
  3. 字節(jié)流(raw bytes)
  4. 從文件中讀取特定格式

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]])
統(tǒng)計函數(shù) 1.png

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)
統(tǒng)計函數(shù) 2.png

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. ])
統(tǒng)計函數(shù) 1.png
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') # 【獲得圖片】
aaa.jpg
aaa_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')
aaa_b.jpg
aaa_c.jpg
aaa_d.jpg

4.3 圖形的手繪

手繪效果特點:

  • 黑白灰色
  • 邊界線較重
  • 相同或相近色彩趨于白色
  • 略有光源效果:根據(jù)灰度變化模擬人類視覺的遠近程度
圖形手繪 1.png
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')
doctor.jpg
doctor_手繪.jpg

利用像素之間的梯度值和虛擬深度值對圖像進行重構(gòu)
根據(jù)灰度變化來模擬人類視覺的明暗程度

目錄:Python數(shù)據(jù)分析與展示
一、NumPy庫
二攻谁、Matplotlib庫
三稚伍、Pandas庫

Python數(shù)據(jù)分析與展示.jpg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市戚宦,隨后出現(xiàn)的幾起案子个曙,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件垦搬,死亡現(xiàn)場離奇詭異呼寸,居然都是意外死亡,警方通過查閱死者的電腦和手機猴贰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門对雪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人米绕,你說我怎么就攤上這事瑟捣。” “怎么了栅干?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵迈套,是天一觀的道長。 經(jīng)常有香客問我碱鳞,道長桑李,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任劫笙,我火速辦了婚禮芙扎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘填大。我一直安慰自己,他們只是感情好俏橘,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布允华。 她就那樣靜靜地躺著,像睡著了一般寥掐。 火紅的嫁衣襯著肌膚如雪靴寂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天召耘,我揣著相機與錄音百炬,去河邊找鬼。 笑死污它,一個胖子當著我的面吹牛剖踊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播衫贬,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼德澈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了固惯?” 一聲冷哼從身側(cè)響起梆造,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎葬毫,沒想到半個月后镇辉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體屡穗,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年忽肛,在試婚紗的時候發(fā)現(xiàn)自己被綠了村砂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡麻裁,死狀恐怖箍镜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情煎源,我是刑警寧澤色迂,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站手销,受9級特大地震影響歇僧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜锋拖,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一诈悍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧兽埃,春花似錦侥钳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瓤逼。三九已至伍宦,卻和暖如春丙号,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背颂跨。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工敢伸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人恒削。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓池颈,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蔓同。 傳聞我的和親對象是個殘疾皇子饶辙,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348