文章目錄
-
-
- 前言
- 引入庫
- 初始數組
- 屬性
- 建立數組及基本操作
- 數組的計算
-
- 總結
前言
Numpy(Numerical Python)是一個開源的Python科學計算庫,用于快速處理任意次元的數組。
Numpy支援常見的數組和矩陣操作。對于同樣的數值計算任務,使用Numpy比直接使用Python要簡潔的多。
Numpy使用ndarray對象來處理多元數組,該對象是一個快速而靈活的大資料容器。
NumPy提供了一個N維數組類型ndarray,它描述了相同類型的“items”的集合。
機器學習的最大特點就是大量的資料運算,那麼如果沒有一個快速的解決方案,那可能現在python也在機器學習領域達不到好的效果。
Numpy底層使用C語言編寫,内部解除了GIL(全局解釋器鎖),其對數組的操作速度不受Python解釋器的限制,是以,其效率遠高于純Python代碼。
numpy内置了并行運算功能,當系統有多個核心時,做某種計算時,numpy會自動做并行計算.
引入庫
import numpy as np
import warnings
warnings.filterwarnings('ignore')
初始數組
類比Excel表格,一維數組就相當于一行,二位數組就相當于一個表格,三維數組就是一個工作簿中的多個表,以此類推,我們常用的是一維數組、二維數組,三維數組用的比較少
- 一維數組
arr = np.array([1,2,3,4])
arr
結果:

- 二維數組
score = np.array(
[[80, 89, 86, 67, 79],
[78, 97, 89, 67, 81],
[90, 94, 78, 67, 74],
[91, 91, 90, 67, 69],
[76, 87, 75, 67, 86],
[70, 79, 84, 67, 84],
[94, 92, 93, 67, 64],
[86, 85, 83, 67, 80]]
)
結果:
屬性
- 形狀
score.shape
# 結果
(8, 5)
# 可以了解為8行5列的表
- 次元
score.ndim
# 結果
2
# 表示這個矩陣是二維的
- 元素個數
score.size
# 結果
40
# 一共有40個元素
- 類型
score.dtype
# 結果
dtype('int32')
# 元素屬性是 int32 類型的
建立數組及基本操作
- 生成數組
- 全是0的數組
**結果: **
2. 全是1的數組
結果:
- 現有數組生成
a = np.array([[1,2,3],[2,3,4]])
np.asarray(a,dtype='uint32')
結果:
- 生成特殊數組
- 等間距數列
np.linspace(
start,
stop,
num=50,
endpoint=True,
retstep=False,
dtype=None,
axis=0,
)
# start:序列的起始值
# stop:序列的終止值
# num:要生成的等間隔樣例數量,預設為50
# endpoint:序列中是否包含stop值,預設為ture
np.linspace(0, 100, 11,dtype=np.int32)
# 結果
array([ 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100])
- 等差數列
np.arange(1,10,2)
# 結果
array([1, 3, 5, 7, 9])
- 10^n等比數組
np.logspace(start=1,stop=3, num=3)
# 結果
array([ 10., 100., 1000.])
- 生成随機數組
- 正态分布
标準正太分布
結果:
指定的正态分布
結果:
方法參數詳解
np.random.normal(
loc, # 正态分布的中心
scale, # 分布的寬度(标準差)
size # shape(形狀)
)
指定shape的标準正态分布
結果:
- 均勻分布
[0,1]之間的均勻分布
結果:
指定區間的均勻分布數組
np.random.uniform(low=0.0, high=1.0, size=None)
# 結果
0.788561235247165
# 參數
# low: 采樣下界,float類型,預設值為0;
# high: 采樣上界,float類型,預設值為1;
# size: 輸出樣本數目,為int或元組(tuple)類型,例如,size=(m,n,k), 則輸出mnk個樣本,預設時輸出1個值。
指定範圍的整數型均勻分布
從一個均勻分布中随機采樣,生成一個整數或N維整數數組
np.random.randint(
low=1, # 最小值
high=10, # 最大值
size=(10,10), # shape
dtype='l'
)
- 數組的索引、切片
數組的切片可以類比清單的切片,但是數組的切片涉及到次元,略有不同
數組的切片是先行後列
arr[0,:3] # :3 左閉右開區間,即含左不含右
# 0 行 前三個元素
# 結果
array([2, 3, 4])
- 修改形狀
修改形狀必須保持修改前後元素的個數必須一緻
**結果: **
結果:
reshape 和 resize 的差別在于,reshape不改變原有數組傳回新的數組,resize直接改變原數組
- 數組轉置
數組的行列轉換
arr.T
**結果: **
- 類型轉換
arr.dtype
# 結果
dtype('int32')
結果:
- 數組轉Python清單
arr.tolist()
# 結果
[[2, 3, 4, 6, 3, 6, 8, 6, 3]]
- 多元數組轉清單
arr.flatten().tolist() # 壓縮成一維數組再轉換
# 結果
[2, 3, 4, 6, 3, 6, 8, 6, 3]
- 數組去重
temp = np.array([[1, 2, 3, 4],[3, 4, 5, 6]])
np.unique(temp)
# 結果
array([1, 2, 3, 4, 5, 6])
數組的計算
- 邏輯運算
結果:
邏輯運算有 >,<,==,>=,<=,!=等等
篩選大于60的值
結果:
- 通用判斷
- all
np.all(score)
# 結果
True
數組中是否全部為True,python中,不等于0都代表True,等個0代表False
- any
np.any(score)
# 結果
True
數組中是否至少一個為True
- 三元運算
python有三元運算,numpy中也有,但是會有所不同
a = 77
print('及格' if a>=60 else "不及格" )
# 結果
'及格'
python的三元運算嵌套
a = 77
print('A' if a>=90 else "B" if a>=75 and a<90 else "C" if a>=60 and a<75 else "D")
# 結果
B
numpy的三元運算
score
結果:
numpy三元運算嵌套
np.where(score>=90,"A",
np.where(np.logical_and(score>=75,score<90),"B",
np.where(np.logical_and(score>=60,score<75),"C","D")))
**結果: **
numpy中邏輯and 和 or,不能直接使用,需要用到特定的函數 np.logical_and和np.logical_or
- 描述性統計名額
- 和
score.sum()
# 結果
3507
score.sum(axis=1) # axis=None求全部的,axis=0,按列統計,axis=1按行統計
# 結果
array([287, 421, 323, 366, 360, 301, 401, 305, 381, 362])
- 最大值
score.max()
# 結果
98
- 平均值
ndarray的最大、最小、平均值、和等方法底層是調用了numpy的相關方法,他們的計算結果一樣
score.mean()
# 結果 70.14
np.mean(score)
# 結果 70.14
- 中位數
ndarray沒有中位數的方法,可以調用numpy的中位數方法
np.median(score)
# 結果
72.5
- 方差、 标準差
score.var(),score.std()
# 結果
(300.8404, 17.344751367488666)
- 數組間的運算
1.數組與數的運算
數組與數的運算,其實就是數組中的每個元素與這個數的運算
**結果: **
2. 數組與數組間的運算
數組間的基本運算必須是兩個相同結構的數組,即行列必須一緻
score_1 = np.ones_like(score)
score_1
結果
兩個數組間的基本運算 就是對應位置的元素的基本運算
score+score_1
結果
3. 數組相乘
結果:
廣播機制
廣播機制實作了時兩個或兩個以上數組的運算,即使這些數組的shape不是完全相同的,隻需要滿足如下任意一個條件即可。
1.數組的某一次元等長。
2.其中一個數組的某一次元為1 。
廣播機制需要擴充次元小的數組,使得它與次元最大的數組的shape值相同,以便使用元素級函數或者運算符進行運算。
arr_a = np.random.randint(10,100,(10,5))
arr_a
arr_b = np.random.randint(10,100,5)
arr_b
**結果: **
arr_a + arr_b
結果
廣播機制要求在某個次元上的長度一緻,另一個次元為1,numpy會将為1的次元擴充成與運算對象一樣的次元
- 矩陣
矩陣必須是二維的,向量是特殊的矩陣,一列就是一個向量
相同行列數的矩陣之間的基本運算與數組一樣,矩陣間的乘法稱為點乘
點乘的運算原理
A矩陣的第 m 行 與 B矩陣的m列元素一一相乘并求和,得到結果的一個元素
以一個二維矩陣為例,其結果是這樣來的
矩陣間的點乘必須遵循
–(M行, N列)*(N行, L列) = (M行, L列)–
met_1 = np.random.randint(10,50,(10,2))
met_2 = np.random.randint(10,50,(2,5))
np.dot(met_1,met_2)
**結果: **
np.matmul 與 np.dot 都是求矩陣的點乘, 差別在于matmul 不支援矩陣與标量間的運算
總結
代碼的功底都是通過不斷的練習一步步積累起來的,和我一起學pandas吧!