Python的科學(xué)計(jì)算包 - Numpy
numpy(Numerical Python extensions)是一個(gè)第三方的Python包,用于科學(xué)計(jì)算。這個(gè)庫(kù)的前身是1995年就開(kāi)始開(kāi)發(fā)的一個(gè)用于數(shù)組運(yùn)算的庫(kù)。經(jīng)過(guò)了長(zhǎng)時(shí)間的發(fā)展,基本上成了絕大部分Python科學(xué)計(jì)算的基礎(chǔ)包,當(dāng)然也包括所有提供Python接口的深度學(xué)習(xí)框架。
numpy在Linux下的安裝已經(jīng)在5.1.2中作為例子講過(guò),Windows下也可以通過(guò)pip,或者到下面網(wǎng)址下載:
Obtaining NumPy & SciPy libraries
5.3.1 基本類(lèi)型(array)
array,也就是數(shù)組,是numpy中最基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu),最關(guān)鍵的屬性是維度和元素類(lèi)型,在numpy中,可以非常方便地創(chuàng)建各種不同類(lèi)型的多維數(shù)組,并且執(zhí)行一些基本基本操作,來(lái)看例子:
import numpy as np
a = [1, 2, 3, 4] #
b = np.array(a) # array([1, 2, 3, 4])
type(b) #
b.shape # (4,)
b.argmax() # 3
b.max() # 4
b.mean() # 2.5
c = [[1, 2], [3, 4]] # 二維列表
d = np.array(c) # 二維numpy數(shù)組
d.shape # (2, 2)
d.size # 4
d.max(axis=0) # 找維度0,也就是最后一個(gè)維度上的最大值,array([3, 4])
d.max(axis=1) # 找維度1,也就是倒數(shù)第二個(gè)維度上的最大值,array([2, 4])
d.mean(axis=0) # 找維度0,也就是第一個(gè)維度上的均值,array([ 2., 3.])
d.flatten() # 展開(kāi)一個(gè)numpy數(shù)組為1維數(shù)組,array([1, 2, 3, 4])
np.ravel(c) # 展開(kāi)一個(gè)可以解析的結(jié)構(gòu)為1維數(shù)組,array([1, 2, 3, 4])
# 3x3的浮點(diǎn)型2維數(shù)組,并且初始化所有元素值為1
e = np.ones((3, 3), dtype=np.float)
# 創(chuàng)建一個(gè)一維數(shù)組,元素值是把3重復(fù)4次,array([3, 3, 3, 3])
f = np.repeat(3, 4)
# 2x2x3的無(wú)符號(hào)8位整型3維數(shù)組,并且初始化所有元素值為0
g = np.zeros((2, 2, 3), dtype=np.uint8)
g.shape # (2, 2, 3)
h = g.astype(np.float) # 用另一種類(lèi)型表示
l = np.arange(10) # 類(lèi)似range,array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
m = np.linspace(0, 6, 5)# 等差數(shù)列,0到6之間5個(gè)取值,array([ 0., 1.5, 3., 4.5, 6.])
p = np.array(
[[1, 2, 3, 4],
[5, 6, 7, 8]]
)
np.save('p.npy', p) # 保存到文件
q = np.load('p.npy') # 從文件讀取
注意到在導(dǎo)入numpy的時(shí)候,我們將np作為numpy的別名。這是一種習(xí)慣性的用法,后面的章節(jié)中我們也默認(rèn)這么使用。作為一種多維數(shù)組結(jié)構(gòu),array的數(shù)組相關(guān)操作是非常豐富的:
import numpy as np
'''
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 = np.arange(24).reshape((2, 3, 4))
b = a[1][1][1] # 17
'''
array([[ 8, 9, 10, 11],
[20, 21, 22, 23]])
'''
c = a[:, 2, :]
''' 用:表示當(dāng)前維度上所有下標(biāo)
array([[ 1, 5, 9],
[13, 17, 21]])
'''
d = a[:, :, 1]
''' 用...表示沒(méi)有明確指出的維度
array([[ 1, 5, 9],
[13, 17, 21]])
'''
e = a[..., 1]
'''
array([[[ 5, 6],
[ 9, 10]],
[[17, 18],
[21, 22]]])
'''
f = a[:, 1:, 1:-1]
'''
平均分成3份
[array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8])]
'''
g = np.split(np.arange(9), 3)
'''
按照下標(biāo)位置進(jìn)行劃分
[array([0, 1]), array([2, 3, 4, 5]), array([6, 7, 8])]
'''
h = np.split(np.arange(9), [2, -3])
l0 = np.arange(6).reshape((2, 3))
l1 = np.arange(6, 12).reshape((2, 3))
'''
vstack是指沿著縱軸拼接兩個(gè)array,vertical
hstack是指沿著橫軸拼接兩個(gè)array,horizontal
更廣義的拼接用concatenate實(shí)現(xiàn),horizontal后的兩句依次等效于vstack和hstack
stack不是拼接而是在輸入array的基礎(chǔ)上增加一個(gè)新的維度
'''
m = np.vstack((l0, l1))
p = np.hstack((l0, l1))
q = np.concatenate((l0, l1))
r = np.concatenate((l0, l1), axis=-1)
s = np.stack((l0, l1))
'''
按指定軸進(jìn)行轉(zhuǎn)置
array([[[ 0, 3],
[ 6, 9]],
[[ 1, 4],
[ 7, 10]],
[[ 2, 5],
[ 8, 11]]])
'''
t = s.transpose((2, 0, 1))
'''
默認(rèn)轉(zhuǎn)置將維度倒序,對(duì)于2維就是橫縱軸互換
array([[ 0, 4, 8],
[ 1, 5, 9],
[ 2, 6, 10],
[ 3, 7, 11]])
'''
u = a[0].transpose() # 或者u=a[0].T也是獲得轉(zhuǎn)置
'''
逆時(shí)針旋轉(zhuǎn)90度,第二個(gè)參數(shù)是旋轉(zhuǎn)次數(shù)
array([[ 3, 2, 1, 0],
[ 7, 6, 5, 4],
[11, 10, 9, 8]])
'''
v = np.rot90(u, 3)
'''
沿縱軸左右翻轉(zhuǎn)
array([[ 8, 4, 0],
[ 9, 5, 1],
[10, 6, 2],
[11, 7, 3]])
'''
w = np.fliplr(u)
'''
沿水平軸上下翻轉(zhuǎn)
array([[ 3, 7, 11],
[ 2, 6, 10],
[ 1, 5, 9],
[ 0, 4, 8]])
'''
x = np.flipud(u)
'''
按照一維順序滾動(dòng)位移
array([[11, 0, 4],
[ 8, 1, 5],
[ 9, 2, 6],
[10, 3, 7]])
'''
y = np.roll(u, 1)
'''
按照指定軸滾動(dòng)位移
array([[ 8, 0, 4],
[ 9, 1, 5],
[10, 2, 6],
[11, 3, 7]])
'''
z = np.roll(u, 1, axis=1)
對(duì)于一維的array所有Python列表支持的下標(biāo)相關(guān)的方法array也都支持,所以在此沒(méi)有特別列出。
既然叫numerical python,基礎(chǔ)數(shù)學(xué)運(yùn)算也是強(qiáng)大的:
import numpy as np
# 絕對(duì)值,1
a = np.abs(-1)
# sin函數(shù),1.0
b = np.sin(np.pi/2)
# tanh逆函數(shù),0.50000107157840523
c = np.arctanh(0.462118)
# e為底的指數(shù)函數(shù),20.085536923187668
d = np.exp(3)
# 2的3次方,8
f = np.power(2, 3)
# 點(diǎn)積,1*3+2*4=11
g = np.dot([1, 2], [3, 4])
# 開(kāi)方,5
h = np.sqrt(25)
# 求和,10
l = np.sum([1, 2, 3, 4])
# 平均值,5.5
m = np.mean([4, 5, 6, 7])
# 標(biāo)準(zhǔn)差,0.96824583655185426
p = np.std([1, 2, 3, 2, 1, 3, 2, 0])
評(píng)論
查看更多