玩數(shù)據(jù)必備Python庫之numpy使用詳解
前言
numpy 庫是 一個科學(xué)計算庫, 使用方法:import numpy as np
- 用于快速處理任意維度的數(shù)組,存儲的對象是ndarray
- 用于矩陣運(yùn)算,存儲的對象是matrix
1. ndarray介紹
1. ndarray的屬性
item = np.array([[1, 2], [3, 4], [5, 6]]) # ndarray的屬性 print('shape 表示數(shù)組維度的元組', item.shape) # (3, 2) print('ndim 表示數(shù)組維數(shù)', item.ndim) # 2 print('size 表示數(shù)組中元素個數(shù)', item.size) # 6 print('itemsize 表示一個元素所占字節(jié)大小', item.itemsize) # 4 print('dtype 表示數(shù)字元素的類型', item.dtype) # int32
2. ndarray的形狀
ndarray可以是任意維度的數(shù)組
# ndarray的形狀 a1 = np.array([1, 2]) a2 = np.array([[1, 2], [3, 4]]) a3 = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) print('a1是{0}維數(shù)組'.format(a1.ndim)) print('a2是{0}維數(shù)組'.format(a2.ndim)) print('a3是{0}維數(shù)組'.format(a3.ndim)) # a1是1維數(shù)組 # a2是2維數(shù)組 # a3是3維數(shù)組
3. ndarray的類型
創(chuàng)建ndarray對象時,可以使用dtype參數(shù)指定ndarray的類型
# ndarray的類型 item = np.array([[1, 2], [3, 4]], dtype=np.str_) # 設(shè)置類型為字符串 print(item) #[['1' '2'] # ['3' '4']]
2. ndarray的基本操作
生成數(shù)組
1. 生成0和1數(shù)組
# 生成一個3行4列的數(shù)組,元素為0。注意:默認(rèn)類型為浮點型 0. arr_zero = np.zeros([3, 4], dtype=int) # 生成一個3行4列的數(shù)組,元素為1 arr_one = np.ones_like(arr_zero)
2. 從現(xiàn)有數(shù)組生成
array()
a = np.array([[1, 2, 3], [4, 5, 6]]) array = np.array(a) print(array)
asarray()
asarray = np.asarray(a) print(asarray)
array()和asarray()的區(qū)別
a[0, 0] = 100 # 修改元素值 print(array) # array是深拷貝,修改原數(shù)據(jù),現(xiàn)數(shù)據(jù)不變。相當(dāng)于復(fù)制 print(asarray) # asarray是淺拷貝,修改原數(shù)據(jù),現(xiàn)數(shù)據(jù)改變。相當(dāng)于創(chuàng)建快捷方式 # [[1 2 3] # [4 5 6]] # [[100 2 3] # [ 4 5 6]]
3. 生成固定范圍的數(shù)組
linspace(start, stop, num, endpoint) 固定個數(shù),步長相等
# 從0到100,生成11個元素,默認(rèn)包含stop值100,endpoint=True arr = np.linspace(0, 100, 11) print(arr) # [ 0. 10. 20. 30. 40. 50. 60. 70. 80. 90. 100.]
arange(start, stop, step, dtype) 固定步長
# 從0到50,固定步長10生成int類型元素,不包括stop值 arr2 = np.arange(0, 50, 10, np.int32) print(arr2) # [ 0 10 20 30 40]
logspace(start, stop, num) 生成10的N次冪的數(shù)據(jù)
# 從10^0開始到10^3結(jié)束,生成4個元素 arr3 = np.logspace(0, 3, 4) print(arr3) # [ 1. 10. 100. 1000.]
4. 生成隨機(jī)數(shù)組 np.random模塊
4.1. 均勻分布生成
rand(d0, d1, … , dn) 返回一個[0.0, 1.0)內(nèi)的一組均勻分布的數(shù)據(jù)
a1 = np.random.rand(2, 3) print(a1)
uniform(low, high, size) 從一個均勻分布[low, high)中隨機(jī)采樣,可替代rand()方法 常用
a2 = np.random.uniform(1, 10, (2, 3)) print(a2)
randint(low, high, size) 從一個均勻分布[low, high)中隨機(jī)采樣,生成N維整數(shù)數(shù)組
a3 = np.random.randint(1, 10, (2, 3)) print(a3)
生成均勻分布數(shù)據(jù)的小案例
import matplotlib.pyplot as plt # 1.準(zhǔn)備數(shù)據(jù) 在[0,1)范圍內(nèi)生成 100000000 個數(shù)據(jù) x = np.random.uniform(0, 1, 100000000) # 2.畫布 plt.figure(figsize=(20,8), dpi=100) # 3.繪制 x為數(shù)據(jù), bins是要劃分的區(qū)間數(shù) plt.hist(x=x, bins=1000) # 4.顯示 plt.show()
數(shù)據(jù)分布如圖所示:
4.2. 正態(tài)分布生成
randn(d0, d1, … , dn) 從標(biāo)準(zhǔn)正態(tài)分布中返回一個或多個樣本值
a1 = np.random.randn(2, 3) print(a1)
normal(loc, scale, size) loc均值,scale標(biāo)準(zhǔn)差,默認(rèn)size=None,返回一個值 常用
a2 = np.random.normal(1.75, 1, (2, 3)) print(a2)
standard_normal(size) 返回指定形狀的標(biāo)準(zhǔn)正態(tài)分布的數(shù)組
a3 = np.random.standard_normal((2, 3)) print(a3)
生成正態(tài)分布數(shù)據(jù)的小案例
# 1.準(zhǔn)備數(shù)據(jù) x = np.random.normal(1.75, 1, 100000000) # 2.畫布 plt.figure(figsize=(20,8), dpi=100) # 3.繪制 x為數(shù)據(jù), bins是要劃分的區(qū)間數(shù) plt.hist(x=x, bins=1000) # 4.顯示 plt.show()
數(shù)據(jù)分布如圖所示:
數(shù)組索引、切片
- 直接索引,先對行索引,再對列索引
- 高維數(shù)組索引,從宏觀到微觀
# 生成一個5行4列的隨機(jī)數(shù)組,范圍在40~100 score = np.random.randint(40, 100, (5, 4)) print(score) # 獲取第一行,第三列的值 print(score[0, 2]) # 獲取前兩行,前三列的值,注意切片是[),左閉右開 print(score[0:2, 0:3])
修改數(shù)組形狀
reshape(shape[,order]) 返回一個新數(shù)組,原數(shù)組不變,行列順序不變
# 生成一個4行5列的隨機(jī)數(shù)組,范圍在40~100 score = np.random.randint(40, 100, (4, 5)) # 將數(shù)組修改為5行4列 a1 = score.reshape([5, 4]) print(a1) # 若行為-1,表示行不固定,根據(jù)列的大小修改,但必須保證列的大小是總數(shù)的一個因數(shù),否則會報錯 a2 = score.reshape([-1, 10]) # 元素總數(shù)為20,[-1, 10]表示 20/10 修改為2行10列 print(a2)
resize(shape[,order]) 無返回,改變原數(shù)組,行列順序不變
# 將數(shù)組修改為5行4列 score.resize([5, 4]) print(score)
T 返回一個新數(shù)組,原數(shù)組不變,行列順序改變
print(score.T)
修改數(shù)組類型
astype(dtype)
# 生成一個4行5列的隨機(jī)數(shù)組,范圍在[1,5) 類型為浮點型 score = np.random.uniform(1, 5, (4, 5)) # 修改數(shù)組類型為int print(score.astype(np.int_))
數(shù)組去重
np.unique()
arr = np.array([[1, 2, 3, 4], [3, 4, 5, 6]]) print(np.unique(arr)) # [1 2 3 4 5 6]
刪除元素
np.delete(arr,obj,axis)
- arr:ndarray數(shù)組
- obj:刪除元素的位置或者條件
- axis:指定刪除行或者列
3. ndarray運(yùn)算
邏輯運(yùn)算
- 大于、小于直接進(jìn)行比較
- bool賦值,通過布爾索引進(jìn)行賦值
arr = np.random.normal(0.75, 1, (3, 4)) print(arr) # 邏輯判斷 如果值大于0,標(biāo)記為True,否則為False print(arr > 0) # 大于、小于 直接進(jìn)行比較 # bool賦值,通過布爾索引進(jìn)行賦值 arr[arr > 0] = 2 # 將大于0的元素賦值為2 print(arr) # [[ 1.61640357 -0.21286798 0.67147044 1.07099177] # [ 0.87844707 -0.30592255 2.51825124 -0.53368643] # [ 0.85427772 -1.21688459 -0.81051012 0.77601911]] # [[ True False True True] # [ True False True False] # [ True False False True]] # [[ 2. -0.21286798 2. 2. ] # [ 2. -0.30592255 2. -0.53368643] # [ 2. -1.21688459 -0.81051012 2. ]]
通用判斷函數(shù)
- np.all() 所有元素都滿足才會返回True
- np.any() 任何一個元素滿足都會返回True
# 通用判斷函數(shù) arr = np.random.normal(0.75, 1, (3, 4)) print(arr) # np.all() 所有元素都滿足才會返回True print(np.all(arr > 0)) # np.any() 任何一個元素滿足都會返回True print(np.any(arr > 0)) # [[ 2.96745424 1.13869564 2.42304826 1.00264569] # [ 1.09160352 1.67433992 0.80692908 0.87226686] # [-0.11395954 -0.10808592 2.67034408 1.06746313]] # False # True
三元運(yùn)算符
- np.where(表達(dá)式, value1, value2) 表達(dá)式為True,執(zhí)行value1, 否則執(zhí)行value2
- 復(fù)合邏輯需要結(jié)合 np.logical_and() 或 np.logical_or() 使用
# 三元運(yùn)算符 arr = np.random.normal(0.75, 1, (3, 4)) print(arr) # np.where(表達(dá)式, value1, value2) 表達(dá)式為True,執(zhí)行value1, 否則執(zhí)行value2 print(np.where(arr > 0, 1, 0)) # 復(fù)合邏輯需要結(jié)合 np.logical_and() 或 np.logical_or() 使用 print(np.where(np.logical_and(arr > 0.5, arr < 1), 1, 0)) # 大于0.5并且小于1 print(np.where(np.logical_or(arr > 0.5, arr < -0.5), 1, 0)) # 大于0.5或者小于-0.5 # [[-0.55217725 1.50314214 0.35100255 1.76121231] # [-0.47892572 1.7304177 1.19885493 0.28415964] # [ 0.83477297 0.76201994 0.40926624 0.95691155]] # [[0 1 1 1] # [0 1 1 1] # [1 1 1 1]] # [[0 0 0 0] # [0 0 0 0] # [1 1 0 1]] # [[1 1 0 1] # [0 1 1 0] # [1 1 0 1]]
統(tǒng)計運(yùn)算
- min() 最小值
- max() 最大值
- mean() 均值
- std() 標(biāo)準(zhǔn)差
- var() 方差
- argmin() 最小值的下標(biāo)
- argmax() 最大值的下標(biāo)
統(tǒng)計時,還可以指定統(tǒng)計軸axis(行或者列),在每個軸上進(jìn)行統(tǒng)計, axis軸的取值并不固定,在本例中,axis 0表示列,1表示行
arr = np.random.normal(0.75, 1, (3, 4)) print(arr) print(np.max(arr)) # 最大值 print(np.max(arr, axis=1)) # 每行的最大值 # [[ 0.25961034 0.56145924 0.71150806 -0.17447214] # [ 0.70701591 -0.16176053 0.24923484 0.48678436] # [ 1.21328659 -0.15891988 1.69161668 1.42672955]] # 1.6916166794484437 # [0.71150806 0.70701591 1.69161668]
數(shù)組運(yùn)算
數(shù)組與標(biāo)量運(yùn)算
對應(yīng)元素直接進(jìn)行運(yùn)算
arr = np.array([1, 0, 5]) print(arr) print(arr + 2) print(arr * 2) # [1 0 5] # [3 2 7] # [ 2 0 10]
數(shù)組與數(shù)組運(yùn)算
數(shù)組之間的運(yùn)算需要滿足廣播機(jī)制才可以運(yùn)算,兩個條件
- 維度相等
- shape(其中相對應(yīng)的一個地方為1)
條件可以表示為:
可以運(yùn)算: A (3d array): 5 x 4 x 7 B (3d array): 5 x 1 x 1 Result (3d array): 5 x 4 x 7 A (4d array): 9 x 1 x 7 x 1 B (3d array): 8 x 1 x 5 Result (4d array): 9 x 8 x 7 x 5 A (2d array): 5 x 4 B (1d array): 1 Result (2d array): 5 x 4 不可以運(yùn)算: A (1d array): 10 B (1d array): 12 A (2d array): 2 x 1 B (3d array): 4 x 3 x 2
arr = np.array([1, 0, 5]) arr2 = np.array([2, 1, 1, 4]) print(arr + arr2) # ValueError: operands could not be broadcast together with shapes (3,) (4,) a = np.array([[1, 2, 3, 2, 1, 4]]) # A (2d array): 1 x 6 b = np.array([[[1], [3], [4]]]) # B (3d array): 1 x 3 x 1 # Result (3d array): 1 x 3 x 6 print(a + b , '新數(shù)組的shade是{}'.format((a+b).shape)) # [[[2 3 4 3 2 5] # [4 5 6 5 4 7] # [5 6 7 6 5 8]]] 新數(shù)組的shade是(1, 3, 6)
4. matrix 矩陣介紹
矩陣和向量
矩陣(matrix),和數(shù)組的區(qū)別:矩陣只能是二維的,數(shù)組可以是多維的
向量:向量是一種特殊的矩陣,一般都是列向量
加法和常量乘法
矩陣的加法:行列數(shù)相等才能相加
矩陣的常量乘法:每個元素都要乘
矩陣間的乘法
兩個矩陣相乘,只有第一個矩陣的列數(shù)等于第二個矩陣的行數(shù)才能相乘,即:(M行,N列) × (N行,L列) = (M行,L列)
矩陣乘法的性質(zhì)
(1) 結(jié)合律: (AB)C=A(BC)
(2) 分配律:(左分配律)C(A+B)=CA+CB
?。ㄓ曳峙渎桑?A+B)C=AC+BC
(3) 對常量的結(jié)合性:k(AB)=(kA)B=A(kB)
單位矩陣
- 從左上角到右下角的對角線均為1,其余元素都為0的矩陣
逆矩陣
- 矩陣A × 矩陣B = 單位矩陣,則A和B互為逆矩陣
轉(zhuǎn)置矩陣
- 行和列互換的矩陣
5. Python中矩陣運(yùn)算
- np.matmul() 兩個矩陣相乘
- np.dot() 兩個矩陣相乘或者矩陣與標(biāo)量相乘
arr1 = np.random.randint(1, 7, (3, 2)) # 3 x 2 矩陣 arr2 = np.random.randint(2, 5, (2, 4)) # 2 x 4 矩陣 print(arr1) print(arr2) print(np.matmul(arr1, arr2)) # 結(jié)果為 3 x 4 矩陣 # print(np.dot(arr1, arr2)) # np.dot() 支持與標(biāo)量相乘 print(np.dot(arr1, 5)) # 結(jié)果為 3 x 2 矩陣 # [[6 5] # [2 1] # [5 1]] # [[2 2 3 4] # [4 2 3 2]] # [[32 22 33 34] # [ 8 6 9 10] # [14 12 18 22]] # [[30 25] # [10 5] # [25 5]]
擴(kuò)展:正態(tài)分布簡介
正態(tài)分布是一種概率分布。正態(tài)分布是具有兩個參數(shù)μ和σ²的連續(xù)型隨機(jī)變量的分布,第一參數(shù)μ是服從正態(tài)分布的隨機(jī)變量的均值,第二個參數(shù)σ²是此隨機(jī)變量的方差,所以正態(tài)分布記作N(μ,σ²)
正態(tài)分布圖
均值:圖形的左右位置
方差:圖形是瘦還是胖
- 方差越小,圖形越瘦高,數(shù)據(jù)越集中
- 方差越大,圖形越矮胖,數(shù)據(jù)越分散
方差
- 方差是在概率論和統(tǒng)計方差衡量隨機(jī)變量或一組數(shù)據(jù)時離散程度的度量。
總結(jié)
到此這篇關(guān)于玩數(shù)據(jù)必備Python庫之numpy使用詳解的文章就介紹到這了,更多相關(guān)Python庫之numpy使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python Requsets下載開源網(wǎng)站的代碼(帶索引 數(shù)據(jù))
這篇文章主要介紹了python Requsets下載開源網(wǎng)站的代碼(帶索引 數(shù)據(jù)),本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04Python使用PyMongo4.x操作MongoDB的教程分享
PyMongo是一個Python編程語言中用于連接和操作MongoDB數(shù)據(jù)庫的庫,它提供了豐富的功能和API,使開發(fā)者能夠在Python中輕松地進(jìn)行MongoDB的數(shù)據(jù)交互和管理,本文給大家總結(jié)了Python如何使用PyMongo4.x操作MongoDB,需要的朋友可以參考下2023-09-09python批量將excel內(nèi)容進(jìn)行翻譯寫入功能
這篇文章主要介紹了python批量將excel內(nèi)容進(jìn)行翻譯寫入功能,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-10-10淺談Python3.10 和 Python3.9 之間的差異
多年來,Python 進(jìn)行了大量升級,并且在新版本中添加了許多功能。本文就詳細(xì)的介紹 一下Python3.10 和 Python3.9差異,感興趣的朋友可以了解一下2021-09-09