Python中的Numpy的基本知識

2021-09-27 02:38:20 字數 4544 閱讀 8172

以下列出一些關於numpy矩陣運算的基本知識和坑點。

首先需要在命令列中安裝numpy庫和繪相簿(可選):

pip install numpy

pip install matplotlib

然後在python檔案的第一行,加入對它們的引用:

import numpy as np

import matplotlib.pyplot as plt

基本矩陣運算

a=np.array([1,2,3,4,5,6]).reshape(2,3)

b=np.array([1,1,1,1,1,1]).reshape(2,3)

print("a:")

print(a)

print("b:")

print(b)

print("a*b:")

print(a*b)

print("np.multiply(a,b):")

print(np.multiply(a,b))

print("np.dot(a,b.t)")

print(np.dot(a,b.t))

print(np.dot(a,b))
結果:

a:

[[1 2 3]

[4 5 6]]

b:[[1 1 1]

[1 1 1]]

a*b:

[[1 2 3]

[4 5 6]]

np.multiply(a,b):

[[1 2 3]

[4 5 6]]

np.dot(a,b.t)

[[ 6 6]

[15 15]]

可以看到,a*b和np.multiply(a,b)的作用是一樣的,都是點乘,即兩個矩陣中相對應位置的數值相乘,element wise operation。它的輸出與相乘矩陣的尺寸一致。

而np.dot是標準的矩陣運算,。如果輸入是(3x2)x(2x4),則輸出為3x4。要求a的列數和b的行數一樣才能相乘,所以我們把b轉置了一下,b本身是2行3列,b.t就是3行2列,a是2行3列,結果是2行2列。所以,一定不要被np.dot這個函式名字迷惑了,它不是點乘的意思。

a=np.array([1,2,3])

b=np.array([1,1,1]).reshape(1,3)

print(a.shape)

print(a*b)

a=a.reshape(3,1)

print(a.shape)

print(a*b)

結果:

(3,)

[[1 2 3]]

(3, 1)

[[1 1 1]

[2 2 2]

[3 3 3]]

第一次定義a時,是乙個1維列向量,shape=(3,),用a*b得到的結果是shape=(1,3)的矩陣[[1 2 3]]。 後來把a.reshape(3,1)3行1列的二維矩陣,雖然表面看起來形式沒變,但是在與b點乘後,得到了乙個(3,3)的矩陣。 為了避免一些錯誤,最好在每次矩陣運算前,都把兩個矩陣reshape成乙個二維矩陣(或多維矩陣)。

神經網路中的計算過程

w=(3x2) w=np.array([1,2,3,4,5,6]).reshape(3,2)

[[1 2]

[3 4]

[5 6]]

b=(3x1) b=np.array([1,2,3]).reshape(3,1)

[[1]

[2][3]]

x=(2x4)(2個特徵值,4個樣本) x=np.array([2,3,4,5,6,7,8,9]).reshape(2,4)

[[2 3 4 5]

[6 7 8 9]]

c=np.dot(w,x)

[[14 17 20 23]

[30 37 44 51]

[46 57 68 79]]

z=c+b = np.dot(w,x) + b 注意:這裡加法有對b的列廣播(自動擴充b為4x3,通過複製b的值為3列)

b=

[[1 1 1 1]

[2 2 2 2]

[3 3 3 3]]

z=[[15 18 21 24]

[32 39 46 53]

[49 60 71 82]]

y=np.array([6,5,4,3]).reshape(1,4) 4個樣本的標籤值

[[6 5 4 3]]
dz = z - y 注意:這裡減法有對z的廣播(通過複製y的值為3行)

z=

[[15 18 21 24]

[32 39 46 53]

[49 60 71 82]]

y=[[6 5 4 3]

[6 5 4 3]

[6 5 4 3]]

dz=[[ 9 13 17 21]

[26 34 42 50]

[43 55 67 79]]

db = dz.sum(axis=1,keepdims=true)/4 4是樣本數。axis=1, 按列相加,即一行內的所有列元素相加。除以4是廣播。

[[15.]

[38.]

[61.]]

dw=np.dot(dz,x.t)/4 x.t是x的轉置。除以4是廣播。 dz=3x4, x.t=4x2, 結果是3x2,正好是w的shape。

[[ 57.5 117.5]

[143. 295. ]

[228.5 472.5]]

w = w - 0.1*dw

[[ -4.75 -9.75]

[-11.3 -25.5 ]

[-17.85 -41.25]]

b = b - 0.1*db

[[-0.5]

[-1.8]

[-3.1]]

隨機初始化

random.randn: 從標準正態分佈中返回乙個或多個樣本值

標準正態分佈就是均值0方差1的正態分佈。

in [22]: data = np.random.randn(3,4)

in [23]: data

out[23]:

array([[-0.34341494, -0.01541249, -0.18014056, -1.30215008],

[ 0.82040243, -0.92564691, 0.79424176, -0.10651544],

[-0.18457542, 0.87839392, -1.72359517, 1.24179385]])

random.rand: 正態分佈隨機樣本位於[0,1)中

in [25]: data2 = np.random.rand(3,4)

in [26]: data2

out[26]:

array([[0.09158799, 0.53545735, 0.58871176, 0.80192998],

[0.28538348, 0.72147261, 0.16966679, 0.43919518],

[0.04111255, 0.86852787, 0.33768262, 0.60136455]])

random.random: 返回指定size的[0,1)隨機數矩陣,random_sample、ranf、sample和它一樣

in [31]: data3 = np.random.random(size = [3,4])

in [32]: data3

out[32]:

array([[0.87703539, 0.65523555, 0.49788619, 0.57268491],

[0.98282024, 0.71298843, 0.49050688, 0.82435907],

[0.90001183, 0.10372421, 0.84826974, 0.47280953]])

random.normal(mean, stdev, size) 正態分佈或高斯分布中取隨機值 返回均值為mean, 標準差為stdev的size個數。

a=np.random.normal(0,2,1000)

>>> a.mean()

-0.009228505457870103 # 均值接近0

>>> a.std()

1.9080292971870287 # 標準差接近2

隨機從[1,1000)中取10個數

>>> np.random.randint(0,1000,10)

array([328, 104, 775, 603, 205, 975, 693, 253, 882, 917])

Python 中 NumPy 的廣播

廣播描述了 numpy 如何在算術運算期間處理具有不同形狀的陣列。為了實現形狀相容,較小的陣列仍在較大的陣列上 廣播 廣播提供了一種向量化陣列操作的方法,以便在 c 而不是 python 中進行迴圈。numpy 通常在逐個元素的基礎上對陣列對進行操作。在最簡單的情況下,兩個陣列必須具有完全相同的形狀...

Python中的Numpy矩陣

與使用陣列一樣,需要從numpy中匯入matrix或者mat模組 from numpy import matrix,mat這裡使用mat建立乙個矩陣 ss.t但是這裡的轉置並沒有改變原變數中的值,如果需要使用,需要新建立乙個變數進行賦值使用。如果需要將兩個矩陣的每個元素對應相乘時使用numpy中的m...

Python中numpy的應用

建立ndarray import numpy as np nd np.array 2,4,6,11 numpy中預設ndarray的所有元素的資料型別是相同,如果資料的型別不同,會統一為統一型別,優先順序為str float int nd array 2 4 6 11 dtype 使用np建立rou...