numpy——科學計算庫的講解(四)
QQ:3020889729 小蔡
本節主要講解numpy基本函數運算:最大值,最小值,總和,平均值,乘積,標準偏差。
本文以jupyter notebook格式展開~
引入numpy庫
import numpy as np
創建隨機的數組數據
——以提供後續的運算操作
創建數組——採用random
data_one = np.random.rand(3, 8)
data_two = np.random.randint(-5, 5, (4, 3))
查看數組數據內容——data,size,dtype,ndim
print("(data_one)\n數組大小:size = {0}\n數組軸數: ndim = {1} \n數組內容:\n{2}, dtype= {3}".format(data_one.size, data_one.ndim, data_one, data_one.dtype))
print("") # 輸出空行以顯示數據易讀
print("(data_two)\n數組大小:size = {0}\n數組軸數: ndim = {1}\n數組內容:\n{2}, dtype= {3}".format(data_two.size, data_two.ndim, data_two, data_two.dtype))
結果(打印):
(data_one)
數組大小:size = 24
數組軸數: ndim = 2
數組內容:
[[0.28483449 0.44235079 0.27778358 0.0241186 0.6076694 0.56056391
0.95386542 0.33498075]
[0.3277708 0.20498337 0.76559908 0.81589987 0.67358283 0.5172844
0.06858265 0.98480717]
[0.74231181 0.36567503 0.64228063 0.31659345 0.70477214 0.10638334
0.23839138 0.32721258]], dtype= float64
(data_two)
數組大小:size = 12
數組軸數: ndim = 2
數組內容:
[[ 3 -2 -1]
[ 4 -3 -1]
[ 0 2 3]
[-2 -5 0]], dtype= int32
接下來首先講解對整個數組的函數運算,再講解沿某一軸進行運算
對數組所有元素進行直接運算
sum()求和函數
print("data_one: \n{0}".format(data_one))
print("") # 輸出空行以顯示數據易讀
print("data_two: \n{0}".format(data_two))
print("") # 輸出空行以顯示數據易讀
print("np.sum(data_one): \n{0}".format(np.sum(data_one))) # 對所有單元進行求和
print("") # 輸出空行以顯示數據易讀
print("np.sum(data_two): \n{0}".format(np.sum(data_two))) # 對所有單元進行求和
結果(打印):
data_one:
[[0.28483449 0.44235079 0.27778358 0.0241186 0.6076694 0.56056391
0.95386542 0.33498075]
[0.3277708 0.20498337 0.76559908 0.81589987 0.67358283 0.5172844
0.06858265 0.98480717]
[0.74231181 0.36567503 0.64228063 0.31659345 0.70477214 0.10638334
0.23839138 0.32721258]]
data_two:
[[ 3 -2 -1]
[ 4 -3 -1]
[ 0 2 3]
[-2 -5 0]]
np.sum(data_one):
11.288297481525387
np.sum(data_two):
-2
min(),max()求最值函數
max——求最大值
print("data_one: \n{0}".format(data_one))
print("") # 輸出空行以顯示數據易讀
print("data_two: \n{0}".format(data_two))
print("") # 輸出空行以顯示數據易讀
print("np.min(data_one): \n{0}".format(np.min(data_one))) # 對所有單元進行最小值求取
print("") # 輸出空行以顯示數據易讀
print("np.min(data_two): \n{0}".format(np.min(data_two))) # 對所有單元進行最小值求取
結果(打印):
data_one:
[[0.28483449 0.44235079 0.27778358 0.0241186 0.6076694 0.56056391
0.95386542 0.33498075]
[0.3277708 0.20498337 0.76559908 0.81589987 0.67358283 0.5172844
0.06858265 0.98480717]
[0.74231181 0.36567503 0.64228063 0.31659345 0.70477214 0.10638334
0.23839138 0.32721258]]
data_two:
[[ 3 -2 -1]
[ 4 -3 -1]
[ 0 2 3]
[-2 -5 0]]
np.min(data_one):
0.024118603470602018
np.min(data_two):
-5
min()——求最小值
print("np.max(data_one): \n{0}".format(np.max(data_one))) # 對所有單元進行最大值求取
print("") # 輸出空行以顯示數據易讀
print("np.max(data_two): \n{0}".format(np.max(data_two))) # 對所有單元進行最大值求取
結果(打印):
np.max(data_one):
0.9848071728962707
np.max(data_two):
4
mean()求平均函數
print("data_one: \n{0}".format(data_one))
print("") # 輸出空行以顯示數據易讀
print("data_two: \n{0}".format(data_two))
print("") # 輸出空行以顯示數據易讀
print("np.mean(data_one): \n{0}".format(np.mean(data_one))) # 對所有單元進行平均值求取
print("") # 輸出空行以顯示數據易讀
print("np.mean(data_two): \n{0}".format(np.mean(data_two))) # 對所有單元進行平均值求取
結果(打印):
data_one:
[[0.28483449 0.44235079 0.27778358 0.0241186 0.6076694 0.56056391
0.95386542 0.33498075]
[0.3277708 0.20498337 0.76559908 0.81589987 0.67358283 0.5172844
0.06858265 0.98480717]
[0.74231181 0.36567503 0.64228063 0.31659345 0.70477214 0.10638334
0.23839138 0.32721258]]
data_two:
[[ 3 -2 -1]
[ 4 -3 -1]
[ 0 2 3]
[-2 -5 0]]
np.mean(data_one):
0.4703457283968911
np.mean(data_two):
-0.16666666666666666
std()求標準偏差(標準方差)
print("data_one: \n{0}".format(data_one))
print("") # 輸出空行以顯示數據易讀
print("data_two: \n{0}".format(data_two))
print("") # 輸出空行以顯示數據易讀
print("np.std(data_one): \n{0}".format(np.std(data_one))) # 對所有單元進行標準偏差值求取
print("") # 輸出空行以顯示數據易讀
print("np.std(data_two): \n{0}".format(np.std(data_two))) # 對所有單元進行標準偏差值求取
結果(打印):
data_one:
[[0.28483449 0.44235079 0.27778358 0.0241186 0.6076694 0.56056391
0.95386542 0.33498075]
[0.3277708 0.20498337 0.76559908 0.81589987 0.67358283 0.5172844
0.06858265 0.98480717]
[0.74231181 0.36567503 0.64228063 0.31659345 0.70477214 0.10638334
0.23839138 0.32721258]]
data_two:
[[ 3 -2 -1]
[ 4 -3 -1]
[ 0 2 3]
[-2 -5 0]]
np.std(data_one):
0.2674934506033342
np.std(data_two):
2.6087459737497545
對數組指定軸進行運算
爲sum()函數添加軸參數,對指定軸進行求和
print("data_one: \n{0}".format(data_one))
print("") # 輸出空行以顯示數據易讀
print("data_two: \n{0}".format(data_two))
print("") # 輸出空行以顯示數據易讀
print("np.sum(data_one, axis=0): \n{0}".format(np.sum(data_one, axis=0))) # 對第0軸所有單元進行求和
print("") # 輸出空行以顯示數據易讀
print("np.sum(data_two, axis=0): \n{0}".format(np.sum(data_two, axis=0))) # 對第0軸所有單元進行求和
結果(打印):
data_one:
[[0.28483449 0.44235079 0.27778358 0.0241186 0.6076694 0.56056391
0.95386542 0.33498075]
[0.3277708 0.20498337 0.76559908 0.81589987 0.67358283 0.5172844
0.06858265 0.98480717]
[0.74231181 0.36567503 0.64228063 0.31659345 0.70477214 0.10638334
0.23839138 0.32721258]]
data_two:
[[ 3 -2 -1]
[ 4 -3 -1]
[ 0 2 3]
[-2 -5 0]]
np.sum(data_one, axis=0):
[1.3549171 1.01300919 1.68566329 1.15661192 1.98602437 1.18423165
1.26083946 1.64700051]
np.sum(data_two, axis=0):
[ 5 -8 1]
對指定軸進行運算的說明:
-
首先說明軸怎麼計算——[1,2,3]:僅含有1個軸,第0軸;[[1,2,3]]:則含有兩個軸,第0軸和第1軸……依次遞推(類似多維數組的定義)
-
對於一個矩陣(擁有兩軸的數組)(如下)進行第0軸的sum運算,基本過程如下:
[[1, 2, 3],
[4, 5, 6],
[7, 8, 9]] (該矩陣爲3*3的矩陣)
sum運算過程如下:(第0軸求和)
1.首先看屬於第0軸的元素:[1, 2, 3], [4, 5, 6], [7, 8, 9]——這就是當前數組中,第0軸的所有元素
2.進行第0軸元素求和:假設元素用字母表示,依次爲,a1,a2,a3
3.又因爲a1,a2,a3又本身是一個向量形式,所以運算a1+a2+a3,就變成了三個向量的加法運算。
4.最後得到的不過是多個向量的相加結果而已。(我想這裏你已經察覺到,向量維度應該保證相同,否則會出錯)
結果:[12, 15, 18]
對第1軸進行sum運算
print("data_one: \n{0}".format(data_one))
print("") # 輸出空行以顯示數據易讀
print("data_two: \n{0}".format(data_two))
print("") # 輸出空行以顯示數據易讀
print("np.sum(data_one, axis=1): \n{0}".format(np.sum(data_one, axis=1))) # 對第1軸所有單元進行求和
print("") # 輸出空行以顯示數據易讀
print("np.sum(data_two, axis=1): \n{0}".format(np.sum(data_two, axis=1))) # 對第1軸所有單元進行求和
結果(打印):
data_one:
[[0.28483449 0.44235079 0.27778358 0.0241186 0.6076694 0.56056391
0.95386542 0.33498075]
[0.3277708 0.20498337 0.76559908 0.81589987 0.67358283 0.5172844
0.06858265 0.98480717]
[0.74231181 0.36567503 0.64228063 0.31659345 0.70477214 0.10638334
0.23839138 0.32721258]]
data_two:
[[ 3 -2 -1]
[ 4 -3 -1]
[ 0 2 3]
[-2 -5 0]]
np.sum(data_one, axis=1):
[3.48616695 4.35851018 3.44362035]
np.sum(data_two, axis=1):
[ 0 0 5 -7]
對第1軸的運算,不過是將求和目標區域移動到了[[a1],[a2]],對a1,a2分別進行求和而已。(第0軸是[[a1],[a2]]中的[a1]和[a2]求和)
接下來展示之前講到的其它運算的軸計算
max()進行軸運算
print("data_one: \n{0}".format(data_one))
print("") # 輸出空行以顯示數據易讀
print("np.max(data_one, axis=0): \n{0}".format(np.max(data_one, axis=0))) # 對第0軸所有單元進行求最大值
print("") # 輸出空行以顯示數據易讀
print("np.max(data_two, axis=1): \n{0}".format(np.max(data_one, axis=1))) # 對第1軸所有單元進行求最大值
結果(打印):
data_one:
[[0.28483449 0.44235079 0.27778358 0.0241186 0.6076694 0.56056391
0.95386542 0.33498075]
[0.3277708 0.20498337 0.76559908 0.81589987 0.67358283 0.5172844
0.06858265 0.98480717]
[0.74231181 0.36567503 0.64228063 0.31659345 0.70477214 0.10638334
0.23839138 0.32721258]]
np.max(data_one, axis=0):
[0.74231181 0.44235079 0.76559908 0.81589987 0.70477214 0.56056391
0.95386542 0.98480717]
np.max(data_two, axis=1):
[0.95386542 0.98480717 0.74231181]
min()進行軸運算
print("data_one: \n{0}".format(data_one))
print("") # 輸出空行以顯示數據易讀
print("np.min(data_one, axis=0): \n{0}".format(np.min(data_one, axis=0))) # 對第0軸所有單元進行求最小值
print("") # 輸出空行以顯示數據易讀
print("np.min(data_two, axis=1): \n{0}".format(np.min(data_one, axis=1))) # 對第1軸所有單元進行求最小值
結果(打印):
data_one:
[[0.28483449 0.44235079 0.27778358 0.0241186 0.6076694 0.56056391
0.95386542 0.33498075]
[0.3277708 0.20498337 0.76559908 0.81589987 0.67358283 0.5172844
0.06858265 0.98480717]
[0.74231181 0.36567503 0.64228063 0.31659345 0.70477214 0.10638334
0.23839138 0.32721258]]
np.min(data_one, axis=0):
[0.28483449 0.20498337 0.27778358 0.0241186 0.6076694 0.10638334
0.06858265 0.32721258]
np.min(data_two, axis=1):
[0.0241186 0.06858265 0.10638334]
mean()進行軸運算
print("data_one: \n{0}".format(data_one))
print("") # 輸出空行以顯示數據易讀
print("np.mean(data_one, axis=0): \n{0}".format(np.mean(data_one, axis=0))) # 對第0軸所有單元進行求平均值
print("") # 輸出空行以顯示數據易讀
print("np.mean(data_two, axis=1): \n{0}".format(np.mean(data_one, axis=1))) # 對第1軸所有單元進行求平均值
結果(打印):
data_one:
[[0.28483449 0.44235079 0.27778358 0.0241186 0.6076694 0.56056391
0.95386542 0.33498075]
[0.3277708 0.20498337 0.76559908 0.81589987 0.67358283 0.5172844
0.06858265 0.98480717]
[0.74231181 0.36567503 0.64228063 0.31659345 0.70477214 0.10638334
0.23839138 0.32721258]]
np.mean(data_one, axis=0):
[0.45163903 0.33766973 0.56188776 0.38553731 0.66200812 0.39474388
0.42027982 0.54900017]
np.mean(data_two, axis=1):
[0.43577087 0.54481377 0.43045254]
std()進行軸運算
print("data_one: \n{0}".format(data_one))
print("") # 輸出空行以顯示數據易讀
print("np.std(data_one, axis=0): \n{0}".format(np.std(data_one, axis=0))) # 對第0軸所有單元進行求標準偏差值
print("") # 輸出空行以顯示數據易讀
print("np.std(data_two, axis=1): \n{0}".format(np.std(data_one, axis=1))) # 對第1軸所有單元進行求標準偏差值
結果(打印):
data_one:
[[0.28483449 0.44235079 0.27778358 0.0241186 0.6076694 0.56056391
0.95386542 0.33498075]
[0.3277708 0.20498337 0.76559908 0.81589987 0.67358283 0.5172844
0.06858265 0.98480717]
[0.74231181 0.36567503 0.64228063 0.31659345 0.70477214 0.10638334
0.23839138 0.32721258]]
np.std(data_one, axis=0):
[0.20628278 0.09890752 0.20710424 0.3268989 0.04047811 0.20466579
0.38361782 0.30817841]
np.std(data_two, axis=1):
[0.26003502 0.30053198 0.21997313]
最後做一個總結:
實用性說明:
- 很多時候,我們用到多軸的array數組構成數據串或者各種各樣的數據陣;當我們處理時,如果要自己獨立編寫函數進行計算的話,效率和運算複雜都是不讓人樂觀的——所以這時候,採用numpy的計算函數進行計算,會方便許多。
內容總結:
-
對數組整體進行函數運算——可以得到數據整體的數據情況。(比如mean(),所有數據的平均值)
-
對數組進行按指定軸運算——可以得到不同部分的數據情況。(比如mean(axis=0),如果我們的數據是二維矩陣,這就相當於按列計算平均值;同樣的,如果使用mean(axis=1),則是進行按行計算平均值。)
如果讀完的你有所收穫,希望勤奮如你不吝點贊+收藏!(還有其它基礎部分發布完後,會有最後一階段實踐的運算操作,比如:神經網絡中層間權重的計算,反向傳播算法等的是實現)