對于array,默認(rèn)執(zhí)行對位運(yùn)算。涉及到多個array的對位運(yùn)算需要array的維度一致,如果一個array的維度和另一個array的子維度一致,則在沒有對齊的維度上分別執(zhí)行對位運(yùn)算,這種機(jī)制叫做廣播(broadcasting),言語解釋比較難,還是看例子理解:
import numpy as np
a = np.array([
[1, 2, 3],
[4, 5, 6]
])
b = np.array([
[1, 2, 3],
[1, 2, 3]
])
'''
維度一樣的array,對位計算
array([[2, 4, 6],
[5, 7, 9]])
'''
a + b
'''
array([[0, 0, 0],
[3, 3, 3]])
'''
a - b
'''
array([[ 1, 4, 9],
[ 4, 10, 18]])
'''
a * b
'''
array([[1, 1, 1],
[4, 2, 2]])
'''
a / b
'''
array([[ 1, 4, 9],
[16, 25, 36]])
'''
a ** 2
'''
array([[ 1, 4, 27],
[ 4, 25, 216]])
'''
a ** b
c = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
[10, 11, 12]
])
d = np.array([2, 2, 2])
'''
廣播機(jī)制讓計算的表達(dá)式保持簡潔
d和c的每一行分別進(jìn)行運(yùn)算
array([[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11],
[12, 13, 14]])
'''
c + d
'''
array([[ 2, 4, 6],
[ 8, 10, 12],
[14, 16, 18],
[20, 22, 24]])
'''
c * d
'''
1和c的每個元素分別進(jìn)行運(yùn)算
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11]])
'''
c - 1
5.3.2 線性代數(shù)模塊(linalg)
在深度學(xué)習(xí)相關(guān)的數(shù)據(jù)處理和運(yùn)算中,線性代數(shù)模塊(linalg)是最常用的之一。結(jié)合numpy提供的基本函數(shù),可以對向量,矩陣,或是說多維張量進(jìn)行一些基本的運(yùn)算:
import numpy as np
a = np.array([3, 4])
np.linalg.norm(a)
b = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
])
c = np.array([1, 0, 1])
# 矩陣和向量之間的乘法
np.dot(b, c) # array([ 4, 10, 16])
np.dot(c, b.T) # array([ 4, 10, 16])
np.trace(b) # 求矩陣的跡,15
np.linalg.det(b) # 求矩陣的行列式值,0
np.linalg.matrix_rank(b) # 求矩陣的秩,2,不滿秩,因為行與行之間等差
d = np.array([
[2, 1],
[1, 2]
])
'''
對正定矩陣求本征值和本征向量
本征值為u,array([ 3., 1.])
本征向量構(gòu)成的二維array為v,
array([[ 0.70710678, -0.70710678],
[ 0.70710678, 0.70710678]])
是沿著45°方向
eig()是一般情況的本征值分解,對于更常見的對稱實數(shù)矩陣,
eigh()更快且更穩(wěn)定,不過輸出的值的順序和eig()是相反的
'''
u, v = np.linalg.eig(d)
# Cholesky分解并重建
l = np.linalg.cholesky(d)
'''
array([[ 2., 1.],
[ 1., 2.]])
'''
np.dot(l, l.T)
e = np.array([
[1, 2],
[3, 4]
])
# 對不鎮(zhèn)定矩陣,進(jìn)行SVD分解并重建
U, s, V = np.linalg.svd(e)
S = np.array([
[s[0], 0],
[0, s[1]]
])
'''
array([[ 1., 2.],
[ 3., 4.]])
'''
np.dot(U, np.dot(S, V))
5.3.3 隨機(jī)模塊(random)
隨機(jī)模塊包含了隨機(jī)數(shù)產(chǎn)生和統(tǒng)計分布相關(guān)的基本函數(shù),Python本身也有隨機(jī)模塊random,不過功能更豐富,還是來看例子:
import numpy as np
import numpy.random as random
# 設(shè)置隨機(jī)數(shù)種子
random.seed(42)
# 產(chǎn)生一個1x3,[0,1)之間的浮點型隨機(jī)數(shù)
# array([[ 0.37454012, 0.95071431, 0.73199394]])
# 后面的例子就不在注釋中給出具體結(jié)果了
random.rand(1, 3)
# 產(chǎn)生一個[0,1)之間的浮點型隨機(jī)數(shù)
random.random()
評論
查看更多